>> и 2>
Тема дорожной карты · Bash
Добавляющее перенаправление — базовая техника написания shell-скриптов в Bash, которая добавляет вывод в конец существующего файла вместо его перезаписи, используя оператор >>. В скриптах автоматизации Linux >> часто используется в паре с 2>> для раздельной дозаписи стандартных ошибок в лог-файл без потери предыдущих записей. В отличие от одиночного оператора >, который усекает целевой файл при каждом запуске, добавляющее перенаправление сохраняет весь предыдущий вывод, что делает его необходимым для постоянного журналирования и создания контрольных журналов. Можно объединить оба потока в один файл с помощью 2>&1 >> или перенаправить стандартный поток ошибок отдельно через 2>> error.log наряду с обычной дозаписью. Освоение добавляющего перенаправления в Bash-скриптах позволяет строить надёжные и неразрушительные конвейеры обработки данных в системах Linux.
Добавляющее перенаправление играет ключевую роль в обеспечении того, чтобы логи и отчеты о работе скриптов не терялись при каждом запуске. Это особенно важно при использовании Bash для автоматизации задач, где требуется сохранение истории выполнения задач или отслеживание ошибок.
Как это работает
> пишет (truncate), >> дописывает, < читает stdin из файла, 2> редиректит stderr, 2>&1 мержит stderr в stdout, &> редиректит оба (bash-расширение). Heredocs: <<EOF ... EOF (var-expanded), <<'EOF' ... EOF (literal). Here-strings: <<< (строка в stdin). Process substitution: <(cmd) и >(cmd) делают fifo-like файл. Tee делит вывод: cmd | tee file.
Когда применять
cmd 2>&1 | tee log.txt — увидеть + сохранить полный вывод. Heredocs — для multi-line строк/скриптов. cmd > out 2> err — захват stdout + stderr раздельно. Process substitution (diff <(cmd1) <(cmd2)) — для избежания temp-файлов, когда команды берут файлы как input.
Типичные ошибки
Ловушки >> и 2>: cmd > file 2>&1 vs cmd 2>&1 > file (порядок важен — первый открывает файл и для stderr, второй шлёт stderr туда, куда stdout был ДО редиректа); случайный clobber важного файла через > (используйте set -o noclobber и >| для override); >> к файлу, которым не владеете (silent fail в restricted-директориях).