Значення '2>> (команда)' Перенаправлення в Bash


18

Деякий час тому я створив сценарій, і я додав кілька журналів навколо нього, але забув, як працює перенаправлення для ведення журналу :-(

Суть її полягає в:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

Коли я запускаю сценарій, він нічого не друкує stdout, а лише друкує те, що йде stderr. Logfile ${LOGFILE}фіксує як stdout, так і stderr.

Коли я запускаю скрипт і на своєму терміналі немає виводу, тоді я знаю, що все добре. Якщо є вихід, я знаю, що щось пішло не так, і я можу перевірити файл журналу, щоб дізнатися, у чому проблема.

Частина перенаправлення, яка зараз мене спантеличує, - це синтаксис: 2> >( some command )

Хтось може пояснити, що там відбувається?

Відповіді:


23

>(...)називається процес заміщення . Це дозволяє «зовнішній» програмі записувати у «внутрішню» програму так, ніби це файл.

У цьому випадку це написання, stderrдо tee -a ${LOGFILE} >&2якого додаватиметься, LOGFILEа потім також записувати все назад stderr.

Оператор перенаправлення може піти в будь-якому напрямку для заміни процесу, тому ви можете написати йому, як у цьому прикладі, або скористатися <(...)для читання з нього, що є зручним способом, наприклад, зробити whileцикл, не запускаючи його в підзаголовок себе.


5
Зрозумів :-) Якщо я виконую echo <(date), це дає мені ім'я заміщає файлу: /dev/fd/63. Якщо я виконую cat <(date), це дає мені дату, тобто зміст заміщає файлу: Fri Nov 18 14:11:09 NZDT 2016.
NZD

@NZD, так - але не уявляйте, що це звичайний файл - те, що ви бачите, /dev- це назва труби між процесами.
Toby Speight

Чи використовується ця методика, тому що stderr не може бути прокладений (до teeцього випадку)?
блі

@bli Так, оскільки stdout вже переспрямовано в інше місце, мені здається, це найпростіший спосіб teestderr та тримати його окремо від stdout.
Ерік Реноф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.