Вики / Базовые команды
tee — вывод в файл и на экран
Раздвоить поток: писать в файл И показывать на экране; 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
См. также
- Базовые команды с файлами — Базовые команды
- Текстовые инструменты (sort, uniq, cut, wc, tr) — Базовые команды
- sudo — Пользователи и права