Мне нужно войти в stdout и stderr в лог-файлы, но только отображать сообщения об ошибках на экране. Я могу сделать это с:
cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2)
Который я нашел где-то в сети.
Я просто хочу знать, как эта >(tee copyError.txt >&2)
вещь называется? Я не могу Google для этого, так как Google игнорирует символы, такие как угловые скобки и скобки ..
Ответы:
От
man bash
:Вы можете искать страницы справочника, нажимая
/
и затем набирая строку поиска, что является хорошим способом поиска такой информации. Это, конечно, требует, чтобы вы знали, в какой man-странице для поиска :)Вы должны процитировать
(
хотя, потому что это имеет особое значение при поиске. Чтобы найти соответствующий раздел на странице руководства bash, введите/>\(
.источник
>(tee copyError.txt >&2)
на самом деле несколько разных функций:>(...)
называется «процесс замещения». Он создает файл именованного канала/dev/fd
и запись в этот файл обеспечит ввод процесса в скобках.>
В общем, это называется «перенаправление вывода» и позволяет отправлять стандартный вывод (>
или1>
) или стандартную ошибку (2>
) в файл или процесс.>&2
является перенаправление вывода , но в этом случае выходной сигналtee
посылается стандартной ошибки (это то, что&2
есть,&1
это стандартный вывод)Без
>
скобок (()
) запускается подоболочка. Запуск команд в скобках приведет к появлению другой оболочки, которая будет существовать только до тех пор, пока эти команды выполняются. Вы можете увидеть, как это работает, если вы объявите переменную в подоболочке:Как видите, то,
$foo
что было определено в подоболочке, отличается от того, что определено в родительской оболочке.источник
>(...)
это не перенаправление.>(...)
расширяется до имени файла. Если вы хотите перенаправить вывод на это, вам нужно,> >(...)
но>(...)
это более широко используется там, где перенаправления не могут быть использованы. Команда OP может быть достигнута с помощью традиционных каналов, здесь нет необходимости в замене процесса.cmd 2>&1 > output | tee err >&2
>
может обозначать перенаправление вывода, и это()
может обозначать подоболочку, но>(...)
на самом деле это единственная унитарная функция, которая не состоит из>
и()
.