tee

Тема дорожной карты · Bash

Команда tee читает со стандартного ввода и одновременно записывает как в стандартный вывод, так и в один или несколько файлов, что делает её незаменимым инструментом для захвата промежуточного вывода в конвейерах Bash и скриптах автоматизации Linux. Типичный шаблон — command | tee logfile.txt | next-command — позволяет сохранить полный вывод команды в лог-файл и при этом передать его дальше по конвейеру для дополнительной обработки; без tee пришлось бы выбирать между журналированием и передачей по каналу. Флаг -a (tee -a logfile.txt) добавляет данные в файл вместо перезаписи, что является правильной практикой для накопления журналов в длительно работающей автоматизации Bash. Когда требуется записать вывод в привилегированный файл на Linux, sudo tee является каноническим решением: echo "value" | sudo tee /etc/config безопаснее, чем sudo bash -c "echo ... > /etc/config", поскольку позволяет избежать открытия привилегированной оболочки. Понимание tee и его взаимодействия с конвейерами Bash, в сочетании с set -o pipefail и $PIPESTATUS, делает из вас более квалифицированного практика shell-скриптов Bash.

Как это работает

tee: > пишет (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.

Типичные ошибки

Ловушки tee: cmd > file 2>&1 vs cmd 2>&1 > file (порядок важен — первый открывает файл и для stderr, второй шлёт stderr туда, куда stdout был ДО редиректа); случайный clobber важного файла через > (используйте set -o noclobber и >| для override); >> к файлу, которым не владеете (silent fail в restricted-директориях).

Связанные понятия

Полезные ресурсы