редирект STDERR в пайп


dainichi - Posted on 11 Март 2009

В баше на первый взгляд нельзя отправить поток STDERR через пайп в другую программу. По крайней мере нельзя просто добавить '2' к операторам '|' и '>()'.

Но на самом деле это делается очень просто:

$ ./command 2>&1 >log_normal | tee log_errors | mail

Дело в том, что операторы редиректа обрабатываются с конца команды. Таким образом, в данном случае сначала stdout будет перенаправлен в файл log_normal, затем stderr будет скопирован в stdout.

Команда

$ ./command >log_normal 2>&1 | tee log_errors | mail

Запишет в log_normal сообщения и из stdout и из stderr, а в log_errors не попадет ничего.

Подобная запись может быть полезна при запуске скриптов из крона, когда лог хочется сохранить в файле, а ошибки - и сохранить в файл, и получить по почте.

PS
Подробнее здесь

2
Ваша оценка: Ничего Рейтинг: 2 (2 голоса)

перенпаравление всего вывода в bash можно осуществить так: ./command &> log_normal | ...

Кстати, а в zsh для этой цели есть "|&" :)

В следующей версии баша тоже обещают...

Не в тему:
а еще наконец-то отменят команду cd. Можно будет заходить в директории просто набрав путь к ней.

В следующей версии баша тоже обещают...

Не в тему:
а еще наконец-то отменят команду cd. Можно будет заходить в директории просто набрав путь к ней.

операторы редиректа обрабатываются с конца команды
Это неправда. Операторы перенаправления обрабатываются слева направо, вот только ничего никуда не копируется. Читаем info "(bash)Redirections" :
ls 2>&1 > DIRLIST
directs only the standard output to file DIRLIST, because the
standard error was duplicated as standard output before the standard
output was redirected to DIRLIST.

Слева от ">" записывается номер потока (если ничего, то #1), справа -- открытый файл. Запись "&номер" справа означает что-то вроде "туда же, куда сейчас поток с таким номером выводится". Итого, сначала поток #2 перенаправляется туда же, куда был направлен поток #1 (в вашем примере -- в открытый канал), а затем поток #1 перенаправляется в файл log_normal.

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.