Гид по технологиям

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

5 min read Linux Обновлено 13 Dec 2025
Команда tee в Linux — вывод в файл и на экран
Команда tee в Linux — вывод в файл и на экран

человек использует команду tee в терминале

Команда 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

разделение вывода ls с помощью tee

Перенаправление вывода дальше по конвейеру

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 для игнорирования прерываний;
  • проверяйте права и код возврата в скриптах.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Компьютер завис на экране загрузки — как исправить
Компьютеры

Компьютер завис на экране загрузки — как исправить

Копирование масок в Camera Raw и Lightroom
Photo Editing

Копирование масок в Camera Raw и Lightroom

Как убрать зелёный треугольник в Excel
Excel

Как убрать зелёный треугольник в Excel

Как понять, что видеокамеру взломали и как реагировать
Безопасность

Как понять, что видеокамеру взломали и как реагировать

Защита от троянов на Android
Безопасность

Защита от троянов на Android

Как исправить поп-ин в играх
Игры

Как исправить поп-ин в играх