Как использовать команду tee в Linux
Введение
В Linux стандартное перенаправление с помощью операторов > и >> сохраняет вывод в файл и не показывает его на экране. Но иногда нужно и видеть вывод, и сохранить его копию для последующего анализа. Для этого служит утилита tee — она дублирует поток вывода (STDOUT) в один или несколько файлов и одновременно пропускает его дальше по конвейеру.

Коротко: tee читается из стандартного ввода и пишет в стандартный вывод и в файлы. Обычно её используют вместе с конвейером (|).
Базовый синтаксис
command | tee options filepathГде options — опции tee (например -a), а filepath — путь к файлу для сохранения вывода.
Пример самого простого использования
Сохранить вывод ls в файл и одновременно увидеть его в терминале:
ls | tee ./output.txtПри указании пути tee проверяет существование файла. Если файла нет — он создаётся автоматически, что удобно в скриптах.

Если файл принадлежит root и вы хотите записать туда вывод, предварите команду sudo.
Если не хотите перезаписывать содержимое файла, используйте флаг -a для дозаписи:
ls | tee -a ./output.txtЧтобы отправить вывод в несколько файлов, перечислите пути через пробел:
ls | tee ./output1.txt ./output2.txtИногда tee прерывается из-за сигналов (например Ctrl+C или Ctrl+Z). Чтобы игнорировать такие сигналы, используйте флаг -i:
ls | tee -i ./output.txtПолучить справку и версию:
tee --help
tee --versionПередача вывода дальше по конвейеру
tee можно вставлять в цепочку команд, чтобы сохранить копию вывода и одновременно передать основной поток дальше для обработки:
command | tee filepath | othercommandПример: сохранить результат ls, а затем отфильтровать его через grep:
ls | tee ./output.txt | grep 'Documents'Это особенно полезно при отладке конвейеров: вы видите результат на экране, сохраняете лог и позволяете следующей команде работать с тем же потоком.
Когда команда tee не подходит
- Когда нужно перенаправлять STDERR (поток ошибок) по умолчанию
teeработает с STDOUT. Для работы со STDERR его нужно явно перенаправить, напримерcommand 2>&1 | tee file. - При работе с бинарными данными стоит убедиться, что промежуточные утилиты не преобразуют кодировку или окончания строк.
- Если требуется атомарная запись (гарантированная целостность файла при конкурирующих записах),
teeне обеспечивает блокировки по умолчанию.
Альтернативы и дополнения
- Перенаправление с объединением потоков:
command 2>&1 | tee file— сохраняет и стандартный вывод, и ошибки. script— записывает интерактивную сессию терминала, включая управляющие последовательности и ввод пользователя.- Использовать
stdbufилиunbufferдля контроля буферизации при работе в сетевых конвейерах. - Для логирования в системный журнал используйте
logger.
Умственные модели и эвристика
- Представляйте конвейер как трубу:
tee— это ответвление, которое делает копию потока и отбрасывает её в файл, при этом основной поток продолжает движение. - Если важно не потерять данные — дозаписывайте (
-a) и также сохраняйте STDERR. - Для автоматизированных задач в скриптах добавляйте отметки времени (
date) рядом с выводом или включайте префиксы в лог.
Методика: как логировать вывод команды в скрипте (мини-план)
- Определить место хранения логов и обеспечить права доступа:
/var/log/myapp/. - Формировать имена файлов по шаблону с датой:
log-$(date '+%Y-%m-%d').log. - Запускать команду и дозаписывать вывод:
command 2>&1 | tee -a "$LOGFILE". - При необходимости сжать старые логи и установить ротацию (logrotate).
- Проверить доступность диска и размер логов перед записью.
Чек-листы по ролям
Сисадмин:
- Проверить права на файл/каталог перед записью.
- Использовать
sudoпри записи в системные каталоги. - Настроить ротацию логов.
Разработчик:
- Использовать
teeдля отладки пайплайнов. - Дозаписывать вывод при CI-задачах, чтобы сохранить историю запуска.
- Использовать
DevOps:
- Перенаправлять STDERR вместе с STDOUT для полноты логов.
- Интегрировать с системами сбора логов (Fluentd, Filebeat).
Шпаргалка по командам (cheat sheet)
- Сохранить вывод и показать на экране:
command | tee ./output.txt- Дозаписать в файл:
command | tee -a ./output.txt- Игнорировать сигналы прерывания:
command | tee -i ./output.txt- Сохранить STDOUT и STDERR:
command 2>&1 | tee ./output.txt- Сохранить в несколько файлов:
command | tee ./out1.txt ./out2.txtПримеры и тесты приёмки
Короткие тесты, чтобы убедиться, что tee работает как ожидается:
- Тест 1:
echo hello | tee out.txt— файлout.txtсодержитhelloи терминал показываетhello. - Тест 2:
ls nonexist 2>&1 | tee err.txt—err.txtсодержит сообщение об ошибке. - Тест 3:
seq 1 3 | tee -a out.txt— числа добавляются к существующему файлу.
Критерии приёмки
- Файл создаётся при отсутствии и содержит копию вывода.
- При
-aсодержимое не перезаписывается. - STDERR включён при использовании
2>&1.
Решение для типичных проблем
- Если не видите вывод в терминале — проверьте, не перенаправлен ли STDOUT в другой дескриптор.
- Если файл остаётся пустым — проверьте права на запись и используйте
sudoпри необходимости. - Если вывод пахнет буферизацией (например в фоне) — примените
stdbuf -oLилиunbuffer.
Простая инструкция для автоматизации (playbook)
- Выберите каталог для логов и дождитесь процессов с правами записи.
- В скрипте объявите
LOGFILEи используйте:
command 2>&1 | tee -a "$LOGFILE"- Настройте ротацию логов и уведомления при заполнении диска.
Диаграмма принятия решения
flowchart TD
A[Нужно ли видеть вывод и сохранять?] -->|Нет| B[Обычное перенаправление: > или >>]
A -->|Да| C[Нужно ли сохранять STDERR?]
C -->|Да| D[Используйте command 2>&1 | tee -a file]
C -->|Нет| E[Используйте command | tee -a file]
D --> F[Настроить ротацию логов]
E --> F1-строчный глоссарий
- STDOUT — стандартный поток вывода программы.
- STDERR — стандартный поток ошибок.
- Конвейер (pipe) — оператор
|, передаёт вывод одной команды на вход другой.
Итог
Команда tee проста, но гибка: она даёт возможность одновременно видеть результаты в терминале и сохранять их для анализа или передачи дальше. Используйте -a для безопасной дозаписи, перенаправляйте STDERR при необходимости и интегрируйте tee в скрипты с ротацией логов для надёжного логирования.
Сводка ключевых команд:
command | tee filecommand | tee -a filecommand 2>&1 | tee file
Похожие материалы
NetworkManager не запускается на Linux — руководство
Защитите Google Drive на iPhone с Face ID
Сменить адрес электронной почты в Slack — инструкция
Как копировать слои в Photoshop между документами
Эффект печатной машинки с CSS