Как использовать команду tee в Linux

Команда tee — стандартная утилита в Linux для «развилки» стандартного вывода: она читает из stdin, пишет копию в stdout и по одному или несколько файлов. В типичных сценариях tee используется вместе с конвейером (pipe, оператор |), когда нужно сохранить копию промежуточного результата и при этом продолжить обработку.
Основной синтаксис
Определение: tee читает стандартный ввод и записывает данные одновременно в стандартный вывод и в указанные файлы.
Базовый синтаксис выглядит так:
command | tee [опции] путь_к_файлуГде command — команда, генерирующая вывод; опции — дополнительные флаги (см. ниже); путькфайлу — файл для записи. Tee создаст файл, если он отсутствует.
Примеры — дублирование вывода в файл и на экран
Записать вывод ls в файл и одновременно увидеть его в терминале:
ls | tee ./output.txtЕсли вы хотите не перезаписывать файл, а добавлять вывод в конец, используйте флаг -a:
ls | tee -a ./output.txtИногда нужно игнорировать сигналы прерывания (Ctrl+C) для самого процесса tee. Для этого есть флаг -i:
ls | tee -i output.txtЕсли файл защищён (например, принадлежит root), предварите команду sudo:
sudo some_command | sudo tee /var/log/some.logТребование двух sudo объясняется правами на запись: если только первая команда запущена с sudo, tee всё ещё может не иметь прав на запись.
Для справки используйте:
tee --help
tee --versionПеренаправление вывода дальше по конвейеру
Tee можно ставить «в середине» цепочки команд: сначала сохранить копию вывода в файл, затем передать поток следующей команде:
command | tee output.txt | othercommandПример: сохранить список файлов и отфильтровать по имени:
ls | tee output.txt | grep "Documents"В таком случае файл output.txt получит весь исходный вывод ls, а grep обработает тот же поток.
Когда tee полезна и когда нет
Важно: tee хороша для логирования, отладки и промежуточной записи. Но она не заменяет перенаправление вывода для простых случаев, когда вам нужна только запись в файл без отображения.
Контрпримеры и ограничения:
- Если вам нужен только файл и не требуется печать в терминал, проще использовать > или >> (меньше процессов).
- При работе с двоичными потоками или большими объёмами данных дополнительная запись может повлиять на производительность.
- В сетевых файловых системах (NFS) и при проблемах с правами tee может завершиться с ошибкой; скрипты должны проверять код возврата.
Расширенные приёмы и паттерны использования
Множественные файлы:
command | tee file1.log file2.log > /dev/nullЕсли нужно записать в файлы, но не показывать вывод в терминале, перенаправьте stdout tee в /dev/null.
Сохранение и передача ошибок stderr:
command 2>&1 | tee combined.logЗдесь stderr перенаправляется в stdout, и оба потока сохраняются.
Обработка ошибок в скриптах: проверяйте код возврата последней команды в конвейере. Bash по умолчанию возвращает код последней команды; для проверки всех кодов используйте set -o pipefail.
set -o pipefail
command | tee out.log | grep something
if [ $? -ne 0 ]; then
echo "Ошибка в цепочке команд"
fiМентальная модель
Представьте поток данных как реку. Команда tee — это Т-образный ответвитель: часть воды идёт прямо дальше, а часть отводится в «водоём» (файл). Это помогает одновременно анализировать и сохранять состояние потока.
Быстрый шпаргалка (cheat sheet)
- Записать и показать вывод: command | tee file
- Добавлять в конец файла: command | tee -a file
- Игнорировать прерывания: command | tee -i file
- Сохранить stderr тоже: command 2>&1 | tee file
- Не показывать вывод в терминале: command | tee file > /dev/null
- Проверять ошибки во всех участках конвейера: set -o pipefail
Альтернативы и сравнение
и >> — простое перенаправление в файл без показа на экране.
- script — записывает всю сессию терминала, включая взаимодействия пользователя.
- rsyslog/journald — для системного логирования в продуктивных средах.
Выбор зависит от цели: быстрое логирование/отладка — tee; централизованное логирование — системные демоны.
Советы по безопасности и соответствию требованиям конфиденциальности
Важно: при записи логов через tee можно случайно сохранить персональные данные или чувствительную информацию. Перед логированием убедитесь, что в потоке нет приватных токенов, паролей или PII. Для соответствия требованиям защиты данных применяйте маскировку и контролируйте доступ к файлам логов.
Тесты и критерии приёмки для скриптов, использующих tee
Критерии приёмки:
- Файл создаётся при отсутствии и имеет ожидаемое содержимое.
- При использовании -a новые данные добавляются, а старые не теряются.
- При недостатке прав команда корректно сообщает об ошибке и возвращает ненулевой код.
- При set -o pipefail ошибка в любой части конвейера приводит к ненулевому коду возврата.
Примеры тест-кейсов:
- Запуск команды с правами обычного пользователя на запись в защищённый файл — ожидается отказ (код ≠ 0).
- Прерывание (Ctrl+C) при использовании -i — процесс tee должен игнорировать сигнал и завершиться позже по логике конвейера.
Практические чек-листы по ролям
Для системного администратора:
- Проверьте права на файл логов.
- Настройте ротацию логов (logrotate) для файлов, создаваемых tee.
- Используйте set -o pipefail в скриптах.
Для разработчика:
- Добавьте флаги -a и -i там, где нужно.
- Маскируйте чувствительные поля перед записью.
- Пишите тесты, проверяющие поведение при ошибках записи.
Совместимость и нюансы реализации
Команда tee входит в coreutils в большинстве дистрибутивов Linux. В минималистичных системах (например, BusyBox) реализация tee может иметь урезанные опции. Если ваш скрипт должен работать в разных окружениях, проверяйте доступность нужных флагов через –help.
Диаграмма принятия решения
flowchart TD
A[Нужно ли одновременно видеть вывод и сохранить его?] -->|Да| B[Использовать tee]
A -->|Нет, только сохранить| C[Использовать > или >>]
B --> D{Нужно добавлять в файл?}
D -->|Да| E[tee -a]
D -->|Нет| F[tee]
F --> G{Нужно игнорировать Ctrl+C?}
G -->|Да| H[tee -i]
G -->|Нет| I[без -i]Итог
Команда tee — простой и мощный инструмент для дублирования потоков вывода в Linux. Она полезна для отладки, логирования и промежуточной записи данных в цепочках команд. Помните о правах доступа, производительности и конфиденциальности при записи логов.
Важно: для надёжных скриптов всегда учитывайте обработку ошибок (set -o pipefail) и права на файлы.
Краткая сводка:
- tee копирует stdin в stdout и файлы;
- используйте -a для добавления и -i для игнорирования прерываний;
- проверяйте права и код возврата в скриптах.
Похожие материалы
Компьютер завис на экране загрузки — как исправить
Копирование масок в Camera Raw и Lightroom
Как убрать зелёный треугольник в Excel
Как понять, что видеокамеру взломали и как реагировать
Защита от троянов на Android