← Весь справочник

tee

Раздвоить поток — вывести на экран и одновременно записать в файл, в том числе под sudo

tee читает стандартный ввод и пишет его сразу в два места: в стандартный вывод и в один или несколько файлов. Как Т-образный тройник в трубе: поток идёт дальше по конвейеру, а копия остаётся в файле.

Синтаксис

команда | tee [опции] [файл…] [| следующая команда]

Без файлов tee просто передаёт ввод дальше. Файлы создаются, если их нет.

Опции

ОпцияЧто делает
-aдописывать в конец файлов, а не перезаписывать
-iигнорировать сигнал прерывания SIGINT (Ctrl+C)
-pне падать, если читающая сторона конвейера закрылась (например, | head): файлы всё равно будут дописаны до конца
--output-error=режимкак вести себя при ошибке записи: warn, warn-nopipe (так работает -p), exit, exit-nopipe

По умолчанию, если команда справа от tee закрыла канал, tee сразу завершается — и в файл попадает только часть данных.

Код возврата — 0, если все записи прошли успешно; 1, если хотя бы один файл открыть или записать не удалось (остальные при этом всё равно пишутся).

Примеры

# увидеть вывод и сохранить его
ls -l /etc | tee listing.txt | head -n 3

# записать сразу в несколько файлов
echo 'hello' | tee a.txt b.txt

# дописать в конец, ничего не показывая на экране
echo 'one more line' | tee -a a.txt > /dev/null

# сохранить промежуточный результат конвейера и продолжить обработку
sort /etc/passwd | tee sorted.txt | wc -l

# сохранить вместе с ошибками: stderr перенаправить в stdout до tee
ls /etc /nonexistent 2>&1 | tee out.txt | head -n 2

# записать в файл, куда у текущего пользователя нет прав
echo 'option=1' | sudo tee /etc/example.conf > /dev/null
echo 'option=2' | sudo tee -a /etc/example.conf > /dev/null

# многострочный текст в файл через heredoc
tee notes.txt > /dev/null <<'EOF'
first line
second line
EOF

# файл получит всё, хотя head читает только первую строку
seq 100000 | tee -p all.txt | head -n 1
wc -l all.txt

# одновременно записать в файл и посчитать контрольную сумму
echo 'data' | tee copy.txt | sha256sum

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

  • sudo echo … > /etc/файл не сработает: перенаправление > выполняет твоя оболочка, без root. Запускай под sudo тот процесс, который пишет: … | sudo tee /etc/файл.
  • Без -a файл перезаписывается. tee обнуляет файл при запуске, как >.
  • tee тоже печатает на экран. Если нужна только запись, добавь > /dev/null.
  • stderr в tee не попадает. Конвейер | передаёт только stdout; чтобы сохранить и ошибки, пиши 2>&1 перед |. Подробнее — Перенаправления.
  • Код возврата конвейера — от последней команды. false | tee x.txt вернёт 0, ошибка первой команды потеряется. Включи set -o pipefail — см. коды возврата.
  • … | tee файл | head может оставить файл недописанным: когда head закончит, tee получит SIGPIPE и завершится. Добавь -p.
  • Не пиши в файл, который сейчас читаешь. cat f | tee f обычно оставляет f пустым: tee обнуляет его раньше, чем cat успевает прочитать.

См. также

Перенаправления · sudo · exit-codes · head и tail