Как перенаправить ошибки в файл
Только ошибки — в файл:
команда 2> errors.logВывод и ошибки — в один файл:
команда > all.log 2>&1У каждой команды два потока вывода: обычный (номер 1) и поток ошибок (номер 2). На экране они выглядят одинаково, но > направляет в файл только первый, поэтому ошибки по-прежнему видны в терминале. 2> перенаправляет именно второй поток.
Все варианты
| Запись | Что делает |
|---|---|
2> файл | ошибки в файл, файл перезаписывается |
2>> файл | ошибки дописываются в конец файла |
> файл 2>&1 | вывод и ошибки в один файл |
>> файл 2>&1 | вывод и ошибки дописываются в один файл |
&> файл | то же, что > файл 2>&1, короче (только bash) |
> out.log 2> err.log | вывод и ошибки в разные файлы |
2>/dev/null | выбросить ошибки, не показывая их |
> /dev/null 2>&1 | выбросить всё |
/dev/null — особый файл: всё, что в него записано, пропадает.
Порядок важен
команда > all.log 2>&1
команда 2>&1 > all.logПервая строка пишет в файл всё. Вторая — только вывод, а ошибки остаются на экране. Оболочка читает перенаправления слева направо: 2>&1 означает «ошибки — туда, куда сейчас идёт вывод». В первой строке вывод к этому моменту уже направлен в файл, во второй — ещё на экран.
И на экран, и в файл
команда 2>&1 | tee all.log
команда |& tee -a all.logtee показывает всё на экране и одновременно пишет в файл (-a — дописывать). |& — короткая запись 2>&1 | в bash.
В скрипте и в cron
Чтобы весь вывод скрипта шёл в журнал, не дописывая >> к каждой команде, поставьте в начало скрипта:
exec >> /home/ivan/script.log 2>&1Все команды после этой строки пишут и вывод, и ошибки в файл. В расписании cron вывод тоже стоит направлять в файл, иначе ошибки скрипта никто не увидит:
0 3 * * * /home/ivan/bin/backup.sh >> /home/ivan/backup.log 2>&1Подводные камни
>и2>перезаписывают файл без вопросов. Для журнала, который копится, используйте>>и2>>.2>/dev/nullпрячет и важные ошибки. Используйте его, когда точно знаете, какие сообщения убираете (например,Permission deniedприfind /).sudo команда > /etc/файлне работает: перенаправление выполняет ваша оболочка без прав root. Пишитекоманда | sudo tee /etc/файл.
Подробнее о потоках и конвейерах — в уроке Перенаправление вывода и конвейеры.