С чего начать Первые шаги трек · 15 ступеней
Linux Labs

tee — вывод в файл и на экран

3 мин GNU coreutils

Раздвоить поток: писать в файл И показывать на экране; sudo tee для записи в защищённые файлы.

Шпаргалка

4 команды Версия для печати
  • cmd | tee file показать и записать (перезапись)
  • cmd | tee -a file дописать
  • echo x | sudo tee -a /etc/f >/dev/null запись в защищённый файл
  • cmd 2>&1 | tee log вместе с stderr

Обзор

tee читает stdin и пишет его одновременно в файл(ы) и в stdout. Полезно, когда нужно и сохранить вывод, и видеть его, и когда надо записать в файл через sudo (перенаправление > правами sudo не обладает).

Ключи

2

Без -a tee обрезает файл до нуля перед записью — для логов и конфигов, которые дополняются, а не пересоздаются, всегда нужен -a. -i заставляет tee игнорировать SIGINT (Ctrl+C), чтобы прерывание не остановило запись раньше, чем завершится сама команда в конвейере.

Ключ Что делает Пример
-a --append Дописывать в конец файла вместо перезаписи с нуля. echo "line" | sudo tee -a /etc/hosts >/dev/null
-i --ignore-interrupts Игнорировать SIGINT (Ctrl+C), чтобы прерывание не оборвало запись раньше времени. long_command | tee -i log.txt

Ничего не найдено. Попробуй запрос короче.

Рецепты

2

Примеры

bash
make 2>&1 | tee build.log         # видеть сборку И сохранить весь вывод
ls -l | tee files.txt             # показать и записать
echo "127.0.0.1 host" | sudo tee -a /etc/hosts   # -a: ДОПИСАТЬ (в защищённый файл)
command | tee a.txt b.txt         # сразу в несколько файлов
command | tee /dev/null           # «съесть» stdout, но получить код возврата pipefail

Зачем sudo tee

Это главная причина знать tee. Перенаправление выполняет оболочка ДО sudo, поэтому так писать в системный файл нельзя:

bash
sudo echo "строка" > /etc/file      # ошибка: '>' открывает файл от твоего имени
echo "строка" | sudo tee -a /etc/file >/dev/null   # верно: запись делает sudo tee

>/dev/null в конце — чтобы не дублировать вывод на экран (нам нужна только запись).

Неполадки

3

tee перезаписал файл вместо дописывания

Без -a tee обрезает файл. Для логов/конфигов всегда -a.

Код возврата всегда 0, хотя команда упала

В конвейере cmd | tee код берётся от последней команды (tee). Включи set -o pipefail (bash), чтобы видеть падение cmd — см. bash-scripting.

Запись в файл root не удалась

Используй | sudo tee, а не sudo cmd >. См. вкладку «Зачем sudo tee» и sudo.

См. также

  • files-basics — Навигация и файлы — ls, cd, cp, mv, rm, cat, less, head, tail, копипаст в терминале.
  • sudo — Выполнение команд от root и других пользователей; sudoers и NOPASSWD.
  • text-tools — Обработка текста и потоков — сортировка, уникальность, столбцы, подсчёт.
Загрузка…