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

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

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

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


person kevin948    schedule 14.11.2011    source источник
comment
Наведите курсор на теги, которые вы добавили, подписчиков для stdout/stderr = всего 7. Вы получите больше внимания к своей проблеме, если включите тег для оболочки, которую вы используете, bash, я полагаю? Удачи.   -  person shellter    schedule 14.11.2011


Ответы (3)


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

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

Это немного запутанно, давайте рассмотрим это шаг за шагом.

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

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

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

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

person Jarek    schedule 14.11.2011
comment
Вы ученый и джентльмен. Фантастический ответ, и большое спасибо :) - person kevin948; 14.11.2011
comment
Нет необходимости использовать fd 3. Вы можете просто сделать: perl script.pl 2›&1 ›errorTestnormal.out | tee... Первое перенаправление связывает fd 2 (stderr) с каналом, а второе перенаправляет stdout в файл. Если вы сделаете: perl script.pl › errorTestnormal.out 2›&1, то и stderr, и stdout перейдут в файл. - person William Pursell; 14.11.2011

Мне тоже пришлось какое-то время возиться с этим. Чтобы получить 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 по-прежнему выводились на экран.

person R.J.    schedule 12.08.2014

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

person kol    schedule 14.11.2011