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

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

9 min read Linux Обновлено 10 Dec 2025
Команда tee в Linux — сохранить вывод и логирование
Команда tee в Linux — сохранить вывод и логирование

Открытый терминал Linux в Ubuntu, показывающий строку ввода команд и вывод системы.

Быстрые ссылки

  • Что такое команда 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 в терминале.

Если нужен быстрый справочник по опциям:

tee --help

Справка по команде tee, отображаемая в терминале.

Параметры команды tee

Ниже приведена таблица основных опций tee (локализованные описания):

ОпцияОписание
-a или --appendДобавлять вывод в конец файлов вместо перезаписи.
-i или --ignore-interruptsИгнорировать сигналы прерывания (например, Ctrl+C).
-p или --output-errorВыводить сообщение об ошибке в stderr для каждой ошибки при записи в файлы.
--helpПоказать справку по опциям команды.
--versionПоказать версию программы tee.

Важно: стандартная реализация tee перезаписывает файлы по умолчанию — используйте -a для добавления.

Сохранение вывода в файл с помощью tee

Простейший сценарий: сохранить список файлов домашнего каталога в файл, но при этом видеть результат в терминале:

ls ~ | tee list.txt

Использование ls с tee для записи вывода в текстовый файл list.txt.

Содержимое файла можно просмотреть обычными инструментами:

cat list.txt

Просмотр содержимого list.txt с помощью команды cat.

Ещё простой пример с 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

Показ содержимого нескольких файлов с помощью head.

Практическое применение:

  • Одновременное сохранение логов в локальный файл и в файл общего доступа.
  • Запись в несколько файлов для разных этапов обработки (черновик/финал/архив).

Добавление вывода в файл

По умолчанию 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"

Bash-скрипт для чтения ввода пользователя и отображения вывода в терминале.

Практические советы для скриптов:

  • Всегда используйте абсолютные пути к логам в продакшн-скриптах (/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"

Примеры продвинутого использования

  1. Логирование и фильтрация в реальном времени:
tail -f /var/log/syslog | tee /tmp/syslog-copy | grep --line-buffered "ERROR" | tee /tmp/errors.txt
  1. Параллельная обработка и архивирование:
long-running-command | tee >(gzip > out.gz) >(sha256sum > out.sha256) > out.txt

Здесь используются процессы-подстановки оболочки (process substitution) — >(…). tee отправляет поток в три направления: gzip, sha256sum и обычный файл.

  1. Построение пайплайна с обработкой и уведомлением:
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)

  1. Тест: tee записывает в файл и выводит в stdout
  • Вход: echo “test” | tee test.txt
  • Ожидаемый результат: строка отображается в терминале и присутствует в test.txt
  1. Тест: append работает
  • Вход: echo “one” | tee test.txt; echo “two” | tee -a test.txt
  • Ожидаемый результат: test.txt содержит оба значения в порядке записи
  1. Тест: запись в защищённый файл с sudo
  • Вход: echo “x” | sudo tee -a /etc/some.conf
  • Ожидаемый результат: /etc/some.conf обновлён, если есть права
  1. Тест: поток данных проходит через 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

  1. Нужно наблюдать вывод и одновременно сохранять его — используйте tee.
  2. Нужно только записать — используйте > или >>.
  3. Нужно записать и потом ещё обработать — tee в середине пайплайна.
  4. Нужно писать в защищённый файл — запускайте 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 для параллельной обработки.
  • Маскируйте или избегайте логирования чувствительных данных.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Как сменить циферблат на Echo Spot
Руководство

Как сменить циферблат на Echo Spot

Как сделать новостную рассылку в Word
Office

Как сделать новостную рассылку в Word

Автоматические резервные копии в Word
Microsoft Word

Автоматические резервные копии в Word

GPU 0% использования — как исправить
Железо

GPU 0% использования — как исправить

Живые субтитры в Windows 11 — как включить и настроить
Windows

Живые субтитры в Windows 11 — как включить и настроить

Как увеличить масштаб экрана на ПК
Руководство

Как увеличить масштаб экрана на ПК