редирект STDERR в пайп
В баше на первый взгляд нельзя отправить поток 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
Подробнее здесь
- 1630 просмотров

перенпаравление всего вывода в 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.
Отправить комментарий