Tee в Linux: видеть вывод и сохранять его в файл

Tee в Linux: видеть вывод и сохранять его в файл
Содержание статьи

Команда tee читает стандартный ввод и копирует его одновременно в стандартный вывод и указанные файлы. Это удобно, когда результат нужно видеть в терминале и сохранить для разбора. В практикуме Mentoring.digital используем отдельную временную папку, чтобы упражнение не перезаписало рабочий журнал.

Создайте учебный файл и добавьте вторую запись

Пример предназначен для Linux с GNU coreutils и оболочкой Bash. Сначала создайте временную папку, затем выполняйте команды только внутри неё.

practice_dir=$(mktemp -d)
cd "$practice_dir" || exit 1

printf 'first run\n' | tee run.log
printf 'second run\n' | tee -a run.log
cat run.log

Первый вызов создаёт run.log или перезаписывает существующий файл с таким именем. Второй использует -a и добавляет строку в конец. В файле должны оказаться first run и second run. Временная папка позволяет сравнить оба режима без риска для имеющихся данных.

Как сохранить сообщения stderr

Обычный канал | передаёт stdout. Чтобы перед tee объединить stdout и stderr команды, в Bash используют перенаправление 2>&1. Проверьте это на простом процессе:

bash -c 'printf "out\n"; printf "err\n" >&2' 2>&1 | tee both.log
cat both.log

Оба сообщения попадают в файл. При объединении потоков теряется информация о том, из какого потока пришла конкретная строка. Если она нужна для диагностики, сохраняйте потоки отдельно. Порядок сообщений реальной программы также может зависеть от её буферизации.

Файл с выводом не доказывает успех команды

По умолчанию статус конвейера Bash определяется последней командой. Успешная запись tee ещё не означает, что программа перед ней завершилась успешно. Опция pipefail делает ненулевой статус любой команды заметным через общий статус конвейера.

set -o pipefail
bash -c 'printf "failed operation\n"; exit 7' | tee failure.log
pipeline_status=$?
printf 'pipeline status: %s\n' "$pipeline_status"

Для примера ожидается статус 7, если tee успешно записала файл. При нескольких ошибках действует правило Bash для pipefail: берётся статус самой правой команды с ненулевым результатом. Сохраняйте $? сразу после конвейера, пока следующая команда его не заменила.

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

Повторите запись без -a и убедитесь, что прежнее содержимое заменилось. Затем верните добавление. Проверьте поведение при недоступном для записи пути. Не считайте tee системой ротации журналов и не сохраняйте в выводе секреты, которые нельзя помещать в файл.

Команды и потоки можно отработать на курсе DevOps, а способ сбора журналов разобрать с наставником по инфраструктуре.

Похожие статьи по данной теме