Глиф Учебники

Как перенаправить ошибки в файл

Справочник · Командная строка Linux · 1 минута чтения

Только ошибки — в файл:

Bash
команда 2> errors.log

Вывод и ошибки — в один файл:

Bash
команда > 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 — особый файл: всё, что в него записано, пропадает.

Порядок важен

Bash
команда > all.log 2>&1
команда 2>&1 > all.log

Первая строка пишет в файл всё. Вторая — только вывод, а ошибки остаются на экране. Оболочка читает перенаправления слева направо: 2>&1 означает «ошибки — туда, куда сейчас идёт вывод». В первой строке вывод к этому моменту уже направлен в файл, во второй — ещё на экран.

И на экран, и в файл

Bash
команда 2>&1 | tee all.log
команда |& tee -a all.log

tee показывает всё на экране и одновременно пишет в файл (-a — дописывать). |& — короткая запись 2>&1 | в bash.

В скрипте и в cron

Чтобы весь вывод скрипта шёл в журнал, не дописывая >> к каждой команде, поставьте в начало скрипта:

Bash
exec >> /home/ivan/script.log 2>&1

Все команды после этой строки пишут и вывод, и ошибки в файл. В расписании cron вывод тоже стоит направлять в файл, иначе ошибки скрипта никто не увидит:

Текст
0 3 * * * /home/ivan/bin/backup.sh >> /home/ivan/backup.log 2>&1

Подводные камни

Подробнее о потоках и конвейерах — в уроке Перенаправление вывода и конвейеры.