Битлента
Сетевые команды и утилиты5 мин чтения·

tee: как записать вывод команды в файл и одновременно смотреть его в терминале

Как работает tee: запись вывода ping, traceroute и ss в файл с одновременным показом, ключ -a, перенаправление stderr через 2>&1 и запись через sudo tee.

Кратко

команда | tee файл выводит результат на экран и записывает его в файл; ключ -a дописывает вместо перезаписи. Сообщения об ошибках попадают в tee только после 2>&1, а для записи в защищённый файл через sudo применяют sudo tee.

Проблема перенаправления: или экран, или файл

Обычное перенаправление > отправляет вывод команды в файл, и на экране вы ничего не видите. Для короткой команды это терпимо, а для долгой диагностики неудобно: хочется следить за ходом проверки и одновременно сохранить результат для обращения в поддержку. Запускать команду дважды ради этого неразумно, ведь вторая попытка даст уже другие цифры.

Команда tee решает проблему. Её название напоминает тройник в трубопроводе: поток входит с одной стороны и расходится в две. Одна копия идёт на стандартный вывод, то есть на экран или дальше по конвейеру, другая записывается в указанный файл.

Типичный вид: ping -c 20 192.0.2.1 | tee ping.txt. Обычно вы видите ответы по мере поступления (при буферизации вывода возможна задержка, см. ниже), а когда команда завершится, в файле ping.txt окажется то же самое. Файл создаётся, если его нет, и перезаписывается, если он уже существует, так что имя лучше выбирать осмысленное, с датой или названием проверки.

Ключи tee и перенаправления вокруг неё

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

  • команда | tee файл — вывод на экран и в файл, файл перезаписывается.
  • команда | tee -a файл — вывод на экран и в конец файла.
  • команда 2>&1 | tee файл — в tee попадают и обычный вывод, и сообщения об ошибках.
  • команда | tee файл1 файл2 — запись сразу в два файла.
  • команда | tee файл | grep слово — сохранить всё, а на экран показать только отфильтрованное.

Последний пример показывает интересное применение: tee можно ставить в середину конвейера. В файл уйдёт полный вывод, а следующие команды отфильтруют то, что нужно увидеть. Так можно сохранять полный журнал проверки и при этом не тонуть в подробностях на экране.

Ключ -i, который игнорирует сигнал прерывания, в обычной работе нужен редко, смотрите о нём в справке.

Сообщения об ошибках: почему они не попадают в файл

У каждой команды два выходных потока: стандартный вывод и поток ошибок. Конвейер передаёт дальше только первый. Если вы запустите команду, которая печатает сообщения об ошибках, и пропустите её через tee, на экране вы увидите ошибки, но в файле их не окажется. Это сбивает с толку: кажется, что запись неполная.

Исправление — перенаправить поток ошибок в стандартный вывод: команда 2>&1 | tee файл. Запись 2>&1 означает «направить дескриптор 2, то есть ошибки, туда же, куда идёт дескриптор 1». Порядок важен: перенаправление ставят перед вертикальной чертой, иначе оно не сработает как задумано.

В bash есть сокращённая запись |&, но для переносимости между оболочками надёжнее длинная форма. Это пригодится, например, при traceroute: часть сообщений утилита печатает в поток ошибок, и без 2>&1 в файле их не будет. Какие именно сообщения идут в какой поток, зависит от программы, поэтому при сомнении просто добавьте 2>&1: лишним оно не станет.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно

Примеры для сетевой диагностики

Несколько сочетаний, где tee действительно экономит время.

  1. Ограниченная проверка ping с сохранением: ping -c 30 192.0.2.1 | tee ping-gateway.txt. Параметр -c задаёт число пакетов, поэтому команда завершится сама.
  2. Маршрут до узла: traceroute 198.51.100.7 2>&1 | tee route.txt. На Windows аналогом служит tracert, и там вывод тоже можно направить в файл, но tee в классической командной строке нет.
  3. Снимок соединений с отметкой времени: date | tee snapshot.txt, затем ss -tan | tee -a snapshot.txt. Дата попадёт в начало файла, а таблица допишется следом.
  4. Сохранить сырой вывод и показать только ошибки: команда 2>&1 | tee full.log | grep -i error.

Имя файла удобно строить с датой: tee ping-$(date +%F).txt. Форма +%F даёт дату в виде год-месяц-день, и файлы потом легко упорядочить. Не храните в таких файлах лишнего: в них могут оказаться ваши адреса и имена хостов, поэтому перед отправкой другим людям просмотрите содержимое.

Запись в защищённые файлы: sudo tee

Классическая ловушка: команда sudo echo строка > /etc/файл не работает, хотя sudo стоит в начале. Причина в том, что перенаправление > выполняет ваша обычная оболочка, а не команда с повышенными правами, и файл открывается от вашего имени. Получается отказ в доступе.

Выход — отдать запись самой tee, запущенной с повышением прав: echo строка | sudo tee /etc/файл. Здесь tee открывает файл с правами администратора. Отрабатывайте запись на тестовом файле в своей папке, например echo строка | tee test.txt, а системные файлы без копии не трогайте. Для добавления строки в конец используйте ключ -a: echo строка | sudo tee -a /etc/файл. Без -a файл будет перезаписан целиком, и содержимое пропадёт, поэтому проверяйте команду дважды, когда трогаете системные настройки.

Если вывод tee на экране не нужен, его можно отбросить: добавьте в конец > /dev/null. Перед редактированием важных файлов делайте копию. И помните: правку системного файла стоит выполнять только тогда, когда вы понимаете, что она изменит, а не по случайной подсказке из интернета.

Буферизация и задержка вывода в файле

Иногда кажется, что tee «молчит»: на экране пусто, а команда давно работает. Причина обычно в буферизации. Когда вывод программы идёт не на терминал, а в конвейер, многие программы копят данные блоками и отправляют их порциями. Пока блок не заполнился, tee просто нечего записывать и показывать.

С ping, ss и traceroute ситуация зависит от программы и системы, и однозначного правила нет. Если вывод запаздывает, проверьте это на коротком запуске. Для фильтров в середине цепочки есть свои средства: у grep это ключ --line-buffered, который сбрасывает каждую строку сразу. Для остальных утилит существуют внешние обёртки, но их наличие различается между системами, смотрите документацию своей.

Ещё одно следствие: если прервать команду по Ctrl+C раньше времени, часть выведенных строк может не успеть попасть в файл. Для долгих проверок лучше задавать ограниченное число пакетов, чтобы команда завершалась сама и сбрасывала всё накопленное.

Наконец, следите за размером файла. Вывод, который идёт часами, способен занять много места, и tee не ограничивает объём сам. Задайте число пакетов или время работы заранее, а для долгой записи пользуйтесь журналированием средствами системы.

🛡️ Остались проблемы с соединением?
Можно пользоваться постоянно: российские приложения работают, включать и выключать ничего не нужно. Без карты и регистрации, настройка за пару минут.
Попробовать бесплатно
teeперенаправлениеpinglinux

Часто задаваемые вопросы

Читайте также