Перенаправление stdout/stderr в несколько файлов

Мне было интересно, как перенаправить stderr на несколько выходов. Я попробовал это с помощью script, но я не мог заставить его работать правильно. Первый файл должен иметь как stdout, так и stderr, а второй должен иметь ошибки.

perl script.pl &> errorTestnormal.out &2> errorTest.out

Есть ли лучший способ сделать это? Любая помощь приветствуется. Спасибо.

Ответ 1

perl script.pl 2>&1 >errorTestnormal.out | tee -a errorTestnormal.out > errorTest.out

Будет делать то, что вы хотите.

Это немного беспорядочно, позволяет пройти шаг за шагом.

  • Мы говорим, что раньше ходила STDERR STDOUT
  • Мы говорим, что раньше делали STDOUT, теперь переходим к ошибкеTestnormal.out.

Итак, теперь STDOUT печатается в файл, а STDERR печатается на STDOUT. Мы хотим поместить STDERR в 2 разных файла, которые мы можем сделать с tee. tee добавляет текст, который он дает файлу, а также отсылает к STDOUT.

  • Мы используем tee для добавления к errorTestnormal.out, поэтому теперь он содержит все STDOUT и STDERR вывода script.pl.
  • Затем мы пишем STDOUT of tee (который содержит STDERR из script.pl) в errorTest.out

После этого errorTestnormal.out имеет весь вывод STDOUT, а затем весь вывод STDERR. errotTest.out содержит только вывод STDERR.

Ответ 2

Мне тоже пришлось обходиться с этим некоторое время. Чтобы получить stderr в обоих файлах, только ставя stdout в один файл (например, stderr в errors.log и output.log, а затем stdout только в output.log) И в том порядке, в котором они происходят, эта команда лучше:

((sh test.sh 2>&1 1>&3 | tee errors.log) 3>&1 | tee output.log) > /dev/null 2>&1

Последний/dev/nul 2 > & 1 может быть опущен, если вы хотите, чтобы stdout и stderr все еще выводились на экран.

Ответ 3

Я думаю, что в случае 2-го " > " вы попытаетесь отправить вывод ошибки errorTestnormal.out (а не на script.pl) на errorTest.out.