Как называется функция оболочки `> (tee copyError.txt> & 2)`?

11

Мне нужно войти в stdout и stderr в лог-файлы, но только отображать сообщения об ошибках на экране. Я могу сделать это с:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

Который я нашел где-то в сети.

Я просто хочу знать, как эта >(tee copyError.txt >&2)вещь называется? Я не могу Google для этого, так как Google игнорирует символы, такие как угловые скобки и скобки ..

dersimn
источник
Перенаправление файлов ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Картик,
@terdon Я думаю, что ОП заявил, что он хочет записывать в файлы StdOut и StdErr, но также по-прежнему отображать StdErr на экране
Дмитрий Автономов

Ответы:

11

От man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

Вы можете искать страницы справочника, нажимая /и затем набирая строку поиска, что является хорошим способом поиска такой информации. Это, конечно, требует, чтобы вы знали, в какой man-странице для поиска :)

Вы должны процитировать (хотя, потому что это имеет особое значение при поиске. Чтобы найти соответствующий раздел на странице руководства bash, введите />\(.

Мартин фон Виттих
источник
Я много делаю bash, поэтому я сделал man bash> bashman.txt и сделал его доступным только для чтения. Теперь я могу загрузить bashman.txt в другое окно моего текстового редактора (только для чтения) и использовать все возможности редактора для поиска, копирования и вставки.
Джо
8

>(tee copyError.txt >&2) на самом деле несколько разных функций:

  • >(...)называется «процесс замещения». Он создает файл именованного канала/dev/fd и запись в этот файл обеспечит ввод процесса в скобках.

  • >В общем, это называется «перенаправление вывода» и позволяет отправлять стандартный вывод ( >или 1>) или стандартную ошибку ( 2>) в файл или процесс. >&2является перенаправление вывода , но в этом случае выходной сигнал teeпосылается стандартной ошибки (это то, что &2есть, &1это стандартный вывод)

  • Без >скобок ( ()) запускается подоболочка. Запуск команд в скобках приведет к появлению другой оболочки, которая будет существовать только до тех пор, пока эти команды выполняются. Вы можете увидеть, как это работает, если вы объявите переменную в подоболочке:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom

    Как видите, то, $fooчто было определено в подоболочке, отличается от того, что определено в родительской оболочке.

Тердон
источник
4
Нет >(...)это не перенаправление. >(...)расширяется до имени файла. Если вы хотите перенаправить вывод на это, вам нужно, > >(...)но >(...)это более широко используется там, где перенаправления не могут быть использованы. Команда OP может быть достигнута с помощью традиционных каналов, здесь нет необходимости в замене процесса.
Стефан Шазелас
@StephaneChazelas Было бы приятно увидеть решение, которое вы имели в виду
Дмитрий Автономов
3
@chhh,cmd 2>&1 > output | tee err >&2
Стефан Шазелас
@StephaneChazelas спасибо!
Дмитрий Автономов
Первая половина этого ответа неверна или, по крайней мере, сильно вводит в заблуждение; это правда, что >может обозначать перенаправление вывода, и это ()может обозначать подоболочку, но >(...)на самом деле это единственная унитарная функция, которая не состоит из >и ().
Руах