Команда tee в Linux: руководство и примеры

Быстрые ссылки
- Что такое команда tee в Linux?
- Параметры команды tee
- Сохранение вывода в файл с помощью tee
- Запись вывода в несколько файлов одновременно
- Добавление вывода в файл
- Скрытие вывода в терминале
- Перенаправление вывода одной команды в другую
- Использование tee с sudo
- Примеры использования tee в bash-скриптах
- Мониторинг процессов на системе
О чём эта статья
Эта статья объясняет, как работает команда tee, какие у неё опции, и приводит практические сценарии: от простого сохранения вывода до использования в скриптах и при работе с привилегиями. Приведены шаблоны, чек-листы, сценарии тестирования, подходы для отладки и рекомендации по безопасности.
Что такое команда tee в Linux?
Команда tee считывает стандартный ввод (stdin) и пишет его одновременно в стандартный вывод (stdout) и в один или несколько файлов. Представьте себе T-образную трубу: поток данных идёт прямо дальше и одновременно отводится в боковой файл. tee полезна, когда нужно наблюдать вывод команды в терминале и в то же время сохранить его в лог-файл для последующего анализа.
Краткое определение: tee — утилита для дублирования потока данных в файл(ы) без разрыва конвейера команд.
Преимущества:
- Сохраняет вывод для аудита и отладки.
- Позволяет дополнительно обрабатывать данные в конвейере.
- Работает в любых POSIX-совместимых оболочках и входит в пакет coreutils на большинстве дистрибутивов.
Команда имеет простую синтаксис-форму:
tee [OPTION]... [FILE]...Чтобы узнать версию используемой реализации tee, выполните:
tee --version
Если нужен быстрый справочник по опциям:
tee --help
Параметры команды tee
Ниже приведена таблица основных опций tee (локализованные описания):
| Опция | Описание |
|---|---|
-a или --append | Добавлять вывод в конец файлов вместо перезаписи. |
-i или --ignore-interrupts | Игнорировать сигналы прерывания (например, Ctrl+C). |
-p или --output-error | Выводить сообщение об ошибке в stderr для каждой ошибки при записи в файлы. |
--help | Показать справку по опциям команды. |
--version | Показать версию программы tee. |
Важно: стандартная реализация tee перезаписывает файлы по умолчанию — используйте -a для добавления.
Сохранение вывода в файл с помощью tee
Простейший сценарий: сохранить список файлов домашнего каталога в файл, но при этом видеть результат в терминале:
ls ~ | tee list.txt
Содержимое файла можно просмотреть обычными инструментами:
cat list.txt
Ещё простой пример с echo:
echo "Welcome to Ubuntu" | tee output.txtЗатем проверить:
cat output.txtСоветы:
- Если нужно гарантировать запись даже при ошибках, добавляйте опцию -p, чтобы увидеть сообщения об ошибках записи.
- При работе с двоичными потоками tee сохраняет байты без преобразований.
Запись вывода в несколько файлов одновременно
tee поддерживает запись в любое количество файлов, перечисленных через пробел:
echo "Welcome to Ubuntu" | tee file1.txt file2.txt file3.txtКоманда напечатает строку в терминале и запишет её во все три файла. Для просмотра нескольких файлов можно использовать head или cat:
head -v file1.txt file2.txt file3.txt
Практическое применение:
- Одновременное сохранение логов в локальный файл и в файл общего доступа.
- Запись в несколько файлов для разных этапов обработки (черновик/финал/архив).
Добавление вывода в файл
По умолчанию tee перезаписывает содержимое файла. Чтобы добавлять новые записи, используйте -a (append):
# посмотрим текущее содержимое
cat output.txt
# добавим строку в конец
echo "tee Command on Linux" | tee -a output.txt
# проверим
cat output.txtСоветы для логирования:
- Для длительного логирования в скриптах используйте ротацию логов (logrotate) в сочетании с append.
- Если несколько процессов пишут в один файл через tee, возможны состояния гонки; рассмотрите синхронизацию или отдельные файлы с последующей агрегацией.
Скрытие вывода в терминале
Иногда надо сохранить вывод в файл, но не засорять терминал. Для этого перенаправьте stdout tee в /dev/null:
echo "Welcome to Ubuntu" | tee output.txt > /dev/nullКоманда запишет данные в output.txt, но ничего не выведет на экран. /dev/null — то самое «чёрное дно», куда данные отправляются без сохранения.
Альтернативный приём: перенаправлять stderr в /dev/null, если нужно скрыть только сообщения об ошибках:
command 2>/dev/null | tee out.txtПеренаправление вывода одной команды в другую
tee удобно использовать в середине конвейера, чтобы сохранить копию данных и передать поток дальше:
echo "This is Ubuntu" | tee output.txt | wc -cВ этом примере echo выводит строку, tee сохраняет её в файл output.txt и передаёт дальше в wc для подсчёта символов.
Практическое применение:
- Сохранить сырые логи и одновременно прогнать их через фильтры (grep, awk, sed).
- Отправлять данные в анализатор и в файл архива.
Использование tee с sudo
Когда файл защищён (например, в /etc), простое перенаправление через > не сработает под обычным пользователем, даже если команда до перенаправления выполняется с sudo:
# приведёт к отказу: sudo влияет на echo, но перенаправление выполняет оболочка без sudo
echo "This is Ubuntu" | tee -a /etc/file.conf
# правильно: поднимаем tee с sudo
echo "This is Ubuntu" | sudo tee -a /etc/file.confПояснение: перенаправления (>) обрабатываются оболочкой до выполнения sudo. tee, запущенный через sudo, выполняется уже с правами root и может писать в защищённый файл.
Замечание по безопасности:
- Используйте sudo только там, где это необходимо. Логируйте изменения конфигурации и проверяйте ownership/permissions после записи.
Примеры использования tee в bash-скриптах
Логирование даты и времени в скрипте:
#!/bin/bash
date | tee log.txtЕсли нужен лог в несколько файлов:
#!/bin/bash
date | tee log1.txt log2.txtПример интерактивного сценария, сохраняющего ввод пользователя:
#!/bin/bash
log_file="user_input.log"
echo "Please enter some text:"
read user_input
echo "$user_input" | tee -a "$log_file"
echo "User input has been logged to $log_file"
Практические советы для скриптов:
- Всегда используйте абсолютные пути к логам в продакшн-скриптах (/var/log/… или /opt/…).
- Разделяйте логи по компонентам — легче анализировать и вращать.
- При многопоточном доступе используйте отдельные временные файлы и объединяйте их позже, либо применяйте файловые блокировки (flock).
Мониторинг процессов на системе
tee полезна для мониторинга: можно сохранить снимок вывода ps/top/htop и одновременно просмотреть данные. Примеры:
# сохранить список процессов
ps aux | tee processes.txt
# снять снимок top за одну итерацию (non-interactive)
top -b -n 1 | tee top-snapshot.txtПолезные команды для мониторинга, которые часто комбинируют с tee:
- ps — список процессов;
- top/htop — динамическая статистика CPU/памяти;
- vmstat, iostat, sar — метрики производительности;
- pgrep — поиск процессов по имени;
- ss/netstat — сетевые соединения.
Использование в сценариях наблюдаемости:
- Контейнеры: сохраняйте вывод docker stats в файл для последующего анализа.
- CI/CD: сохраняйте артефакты тестов (stdout/stderr) с помощью tee.
Когда команда tee может подвести
- Параллельная запись: если несколько процессов одновременно пишут в один файл через tee, возможны interleaving и частичная порча записей.
- Низкая скорость диска: запись через tee блокирует поток данных до завершения записи в файл — для больших объёмов используйте асинхронную запись или буферизацию.
- Ограничения прав: без sudo запись в защищённые файлы невозможна.
- Форматирование и кодировка: tee не изменяет кодировку; убедитесь, что вывод и файл используют ожидaемую кодировку (UTF-8).
Альтернативы и когда их предпочесть
- Простое перенаправление (> или >>) — проще, если не нужно видеть вывод в терминале.
- script — для записи всей сессии терминала (включая управляющие последовательности).
- rsyslog/journald — для централизованного и долговременного логирования системных сообщений.
- socat — для более сложных сценариев перенаправления потоков и сетевых соединений.
- tee в сочетании с ssh: чтобы удалённо записать вывод на удалённый хост, можно использовать ssh и tee.
Пример записи на удалённый сервер:
command | ssh user@host "cat > /path/to/remote.log"или с sudo на удалённом хосте:
command | ssh user@host "sudo tee -a /etc/remote.conf > /dev/null"Примеры продвинутого использования
- Логирование и фильтрация в реальном времени:
tail -f /var/log/syslog | tee /tmp/syslog-copy | grep --line-buffered "ERROR" | tee /tmp/errors.txt- Параллельная обработка и архивирование:
long-running-command | tee >(gzip > out.gz) >(sha256sum > out.sha256) > out.txtЗдесь используются процессы-подстановки оболочки (process substitution) — >(…). tee отправляет поток в три направления: gzip, sha256sum и обычный файл.
- Построение пайплайна с обработкой и уведомлением:
collect-metrics | tee metrics.log | awk '{ if ($5 > 90) print $0 }' | mail -s "High usage" admin@example.comБезопасность и GDPR-пометки
- Не логируйте чувствительные данные (пароли, токены, персональные данные). Если это неизбежно, шифруйте файлы/каталог или применяйте ротацию и защиту доступа.
- Храните логи в защищённых каталогах (/var/log с правильными правами) и настраивайте аудит доступа.
- Для соответствия требованиям защиты данных удаляйте или маскируйте PII перед записью.
Отладка проблем с tee
Чек-лист для диагностики:
- Проверить права на целевой файл: ls -l /путь/к/файлу
- Убедиться, что файловая система не переполнена: df -h
- Проверить сообщения об ошибках tee с опцией -p
- Убедиться, что кодировка вывода совпадает с ожидаемой
Рекомендации по производительности
- Для больших объёмов данных избегайте синхронных операций записи на медленные диски; используйте буферизацию или временные файлы на fast storage.
- При необходимости масштабирования логирования используйте централизованные системы (Fluentd, Logstash, rsyslog).
Контрольные сценарии и тесты (acceptance)
- Тест: tee записывает в файл и выводит в stdout
- Вход: echo “test” | tee test.txt
- Ожидаемый результат: строка отображается в терминале и присутствует в test.txt
- Тест: append работает
- Вход: echo “one” | tee test.txt; echo “two” | tee -a test.txt
- Ожидаемый результат: test.txt содержит оба значения в порядке записи
- Тест: запись в защищённый файл с sudo
- Вход: echo “x” | sudo tee -a /etc/some.conf
- Ожидаемый результат: /etc/some.conf обновлён, если есть права
- Тест: поток данных проходит через tee в несколько обработчиков
- Вход: printf “%s\n” {1..10000} | tee /tmp/out | wc -l
- Ожидаемый результат: wc возвращает 10000, /tmp/out содержит 10000 строк
Роль‑ориентированные чек‑листы
Для разработчика:
- Использовать tee для сохранения вывода тестов и локальной отладки.
- В скриптах указывать абсолютные пути к логам.
- Не логировать секреты.
Для системного администратора:
- Применять tee + sudo при изменении системных конфигураций.
- Настроить ротацию логов и резервное копирование.
Для инженера по наблюдаемости:
- Интегрировать tee в конвейеры сбора метрик.
- Проверять нагрузку диска и права доступа к логам.
Шаблоны и чек‑лист для внедрения tee в проект
Шаблон базового лог‑скрипта:
#!/bin/bash
LOG_DIR=/var/log/myapp
mkdir -p "$LOG_DIR"
LOG_FILE="$LOG_DIR/myapp-$(date +%F).log"
# Выполнение задачи с логированием
my_command --opt | tee -a "$LOG_FILE" 2>"$LOG_DIR/myapp-error.log"Чек‑лист перед релизом с использованием tee:
- Логи записываются в защищённый каталог
- Настроена ротация логов
- Чувствительные данные маскированы
- Скрипты используют абсолютные пути
Мини‑методология: когда использовать tee
- Нужно наблюдать вывод и одновременно сохранять его — используйте tee.
- Нужно только записать — используйте > или >>.
- Нужно записать и потом ещё обработать — tee в середине пайплайна.
- Нужно писать в защищённый файл — запускайте tee с sudo.
Модель принятия решения (Mermaid)
flowchart TD
A[Начало: есть вывод команды?] --> B{Нужно ли видеть на экране?}
B -- Да --> C{Нужно ли сохранять копию?}
B -- Нет --> D{Нужно ли сохранять копию?}
C -- Да --> E[Использовать tee]
C -- Нет --> F[Оставить stdout]
D -- Да --> G[Использовать > или tee с перенаправлением в /dev/null]
D -- Нет --> H[Ничего не делать]
E --> I{Файл защищён?}
I -- Да --> J[Использовать sudo tee]
I -- Нет --> K[Использовать tee]Краткая справка по совместимости и миграции
- tee входит в GNU coreutils и присутствует на большинстве Linux‑дистрибутивов, BSD и macOS (в macOS возможны отличия в опциях).
- Для переносимых скриптов проверяйте наличие опций (например, -i может отсутствовать в минимальных реализациях).
Примеры реальных сценариев
- CI/CD: сохранять вывод сборки в артефакт и одновременно показывать лог в консоли сборки.
- Диагностика: собирать снимки top/ps при возникновении проблем производительности.
- Безопасность: логирование изменений конфигураций с использованием sudo tee -a /etc/…
Часто встречающиеся ошибки и как их исправлять
Проблема: “Permission denied” при записи в /etc
- Решение: использовать sudo перед tee, а не перед echo/командой перенаправления.
Проблема: частично перемешанный лог при параллельных записях
- Решение: писать в отдельные файлы с последующей агрегацией или использовать блокировки.
Проблема: файл пустой, хотя в терминале вывод есть
- Решение: проверьте права, свободное место на диске и корректность использования пайпа.
Заключение
Команда tee — простой, но мощный инструмент для дублирования потоков вывода в файлы и дальнейшей обработки. Она хорошо подходит для логирования, отладки и построения гибких конвейеров обработки данных. При внедрении tee учитывайте права доступа, производительность и безопасность данных.
Важно: всегда проверяйте, не записываете ли вы чувствительную информацию в лог-файлы и настраивайте ротацию, чтобы файлы логов не занимали весь диск.
Итоговые ключевые рекомендации
- Используйте -a для добавления, если не хотите терять данные.
- Для записи в защищённые файлы запускайте tee через sudo.
- Комбинируйте tee с process substitution для параллельной обработки.
- Маскируйте или избегайте логирования чувствительных данных.