Перенаправление 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
.