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успевает прочитать.