linux-labs

Вики / Базовые команды

tee — вывод в файл и на экран

Команда GNU coreutils БазовоеТекст и потоки

Раздвоить поток: писать в файл И показывать на экране; sudo tee для записи в защищённые файлы.

tee читает stdin и пишет его одновременно в файл(ы) и в stdout. Полезно, когда нужно и сохранить вывод, и видеть его, и когда надо записать в файл через sudo (перенаправление > правами sudo не обладает).

make 2>&1 | tee build.log         # видеть сборку И сохранить весь вывод
ls -l | tee files.txt             # показать и записать
echo "127.0.0.1 host" | sudo tee -a /etc/hosts   # -a: ДОПИСАТЬ (в защищённый файл)
command | tee a.txt b.txt         # сразу в несколько файлов
command | tee /dev/null           # «съесть» stdout, но получить код возврата pipefail

Ключи: -a (append, дописывать а не перезаписывать), -i (игнорировать Ctrl+C).

Это главная причина знать tee. Перенаправление выполняет оболочка ДО sudo, поэтому так писать в системный файл нельзя:

sudo echo "строка" > /etc/file      # ✗ Permission denied: '>' открывает файл от ТЕБЯ
echo "строка" | sudo tee -a /etc/file >/dev/null   # ✓ запись делает sudo tee

>/dev/null в конце — чтобы не дублировать вывод на экран (нам нужна только запись).

tee перезаписал файл вместо дописывания

Без -a tee обрезает файл. Для логов/конфигов всегда -a.

Код возврата всегда 0, хотя команда упала

В конвейере cmd | tee код берётся от последней команды (tee). Включи set -o pipefail (bash), чтобы видеть падение cmd — см. bash-scripting.

Запись в файл root не удалась

Используй | sudo tee, а не sudo cmd >. См. вкладку «Зачем sudo tee» и sudo.

cmd | tee file              # показать и записать (перезапись)
cmd | tee -a file           # дописать
echo x | sudo tee -a /etc/f >/dev/null   # запись в защищённый файл
cmd 2>&1 | tee log          # вместе с stderr

См. также