2017-02-15 15 views
2

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

sh script.sh >> both.log 2>&1 

Однако, я также хочу, чтобы одновременно записывать поток ошибок в отдельный файл, «error.log». Возможно ли это?

+0

Возможного дубликат [Как перенаправить потоки вывод в различные файлы в той же строке Баша] (HTTP : //stackoverflow.com/questions/7901517/how-to-redirect-stderr-and-stdout-to-different-files-in-the-same-line-of-bash) –

ответ

1

Для этого нужно сначала переключения на стандартный вывод и стандартный поток ошибок, который требует дополнительного дескриптора файла:

sh script.sh 3>&2 2>&1 1>&3 3>&- 

Последний оператор закрывает вспомогательный дескриптор файла.

После этого вы можете использовать tee дублировать поток ошибок (который в настоящее время на стандартный ввод) и добавить его в журнал ошибок:

sh script.sh 3>&2 2>&1 1>&3 3>&- | tee -a error.log 

И после этого вы можете направить как стандартный ввод и стандартный поток ошибок в вашей комбинированный журнал:

(sh script.sh 3>&2 2>&1 1>&3 3>&- | tee -a error.log) >> both.log 2>&1 

Скобки вокруг команды важны для захвата потока ошибок всей команды. Без них будет снят только (пустой) поток ошибок команды tee, а остальные по-прежнему будут поступать на терминал.

Примечание: это не проверяет, что файловый дескриптор 3 использовался (открыт) раньше. В Баше вы можете использовать это, чтобы выбрать ранее неиспользуемый дескриптор файла и закрыть его на последнее перенаправлении:

sh script.sh {tmpfd}>&2 2>&1 1>&${tmpfd}- 
4

Вы можете использовать tee для дублирования вывода в двух местах. Объединение, что с некоторыми хитрыми перенаправлениями и ...

script.sh 2>&1 >> both.log | tee -a both.log >> error.log 

Это перенаправляет поток ошибок на стандартный вывод, а затем стандартный вывод в both.log. stderr остается и передается по каналу на tee, который копирует его в оба файла журнала.

+0

Я не вижу, как это сохраняется только std-err msgs в файле 'error.log'. Не смешиваются вместе с '2> & 1' (и неотличимы). ? – shellter

+0

Если заказ был заменен '>> both.log 2> & 1', то они были бы смешаны вместе. Перераспределения противоречат друг другу. '2> & 1' не означает, что« stderr переходит в stdout ». Это означает, что «stderr идет туда, куда собирается stdout». Подумайте об этом как о присвоении переменной. 'x = 5; y = x; x = 7; '- значение' y' равно 5, а не 7. –

+0

Ah, duh..Missed, что позиция '2> & 1' заменена стандартной практикой. Какой большой трюк! Tnx для ответа. – shellter