Введение
Команда tee в Linux представляет собой мощный инструмент, который позволяет просматривать вывод команды в терминале и одновременно сохранять его в файл. Эта функциональность особенно полезна для системных администраторов и разработчиков, которые должны как в реальном времени анализировать вывод, так и сохранять его для последующего анализа.
В этом лабораторном занятии (LabEx) вы познакомитесь с основами мультиплексирования вывода с использованием команды tee. Вы научитесь одновременно отображать вывод и сохранять его, перенаправлять стандартную ошибку и добавлять вывод в существующие файлы. Эти навыки являются важными для эффективного управления журналами, отладки и мониторинга системы в Linux-окружениях.
Основы команды tee
Команда tee в Linux получила свое название от T-образного трубного соединения в сантехнике, которое разделяет поток воды на два направления. Аналогично, команда tee разделяет вывод команды на два направления: на терминал и в файл.
Начнем с перехода в наш рабочий каталог:
cd /home/labex/project
Создание тестового файла
Сначала создадим простой текстовый файл, который мы будем использовать для экспериментов:
echo "Hello, World" > hello.txt
Эта команда создает файл с именем hello.txt, содержащий текст "Hello, World".
Использование команды tee
Теперь используем команду tee для отображения содержимого файла hello.txt в терминале и одновременно копирования его в другой файл:
cat hello.txt | tee copy.txt
В терминале вы должны увидеть следующий вывод:
Hello, World
Часть cat hello.txt считывает содержимое файла hello.txt. Символ вертикальной черты | берет этот вывод и отправляет его в команду tee. Затем команда tee отображает текст в терминале и одновременно записывает его в файл copy.txt.
Убедимся, что содержимое действительно было скопировано в файл copy.txt:
cat copy.txt
Вы должны увидеть такой же вывод:
Hello, World
Понимание структуры команды
Базовый синтаксис команды tee выглядит следующим образом:
command | tee filename
Где:
command- любая команда, которая генерирует вывод|(pipe) отправляет вывод команды вteetee- сама командаfilename- имя файла, в котором будет сохранен вывод
Перенаправление стандартной ошибки с использованием tee
В Linux программы могут выводить информацию через два основных канала:
- Стандартный вывод (stdout): Нормальный вывод программы
- Стандартная ошибка (stderr): Сообщения об ошибках и диагностика
По умолчанию команда tee захватывает только стандартный вывод. Однако в многих ситуациях вам может понадобиться также захватить сообщения об ошибках. Именно здесь пригодится перенаправление вывода.
Понимание перенаправления стандартной ошибки
Создадим скрипт, который выводит как стандартный вывод, так и стандартную ошибку. Сначала перейдите в проектную директорию (если вы еще не там):
cd /home/labex/project
Теперь запустим команду, которая сгенерирует как стандартный вывод, так и стандартную ошибку:
echo "This is standard output"
ls /nonexistentfile
Вы должны увидеть вывод, похожий на следующий:
This is standard output
ls: cannot access '/nonexistentfile': No such file or directory
Обратите внимание, что сообщение об ошибке от команды ls выводится напрямую в терминал.
Перенаправление стандартной ошибки в файл
Сначала посмотрим, как можно перенаправить только ошибочный вывод в файл:
echo "This is standard output"
ls /nonexistentfile 2> error.log
На этот раз вы должны увидеть только следующее:
This is standard output
Сообщение об ошибке было перенаправлено в файл error.log. Синтаксис 2> сообщает оболочке перенаправить стандартную ошибку (дескриптор файла 2) в указанный файл.
Убедимся в содержимом файла error.log:
cat error.log
Вы должны увидеть:
ls: cannot access '/nonexistentfile': No such file or directory
Захват как вывода, так и ошибки с использованием tee
Теперь используем tee для захвата как стандартного вывода, так и стандартной ошибки в файле, а также для их отображения в терминале:
{
echo "This is standard output"
ls /nonexistentfile
} 2>&1 | tee both.log
В терминале вы должны увидеть и вывод, и ошибку:
This is standard output
ls: cannot access '/nonexistentfile': No such file or directory
Проверим содержимое файла both.log:
cat both.log
Вы должны увидеть такой же вывод:
This is standard output
ls: cannot access '/nonexistentfile': No such file or directory
Понимание структуры команды
В команде 2>&1 | tee both.log:
{ ... }группирует несколько команд вместе2>&1перенаправляет стандартную ошибку (дескриптор файла 2) в стандартный вывод (дескриптор файла 1)|передает объединенный вывод в командуteetee both.logотображает вывод в терминале и записывает его в файлboth.log
Эта техника особенно полезна для логирования вывода команд при обслуживании системы или устранении неполадок.
Добавление вывода с использованием tee
По умолчанию команда tee перезаписывает целевой файл каждый раз, когда она используется. Однако в многих сценариях вы, возможно, захотите добавить новую информацию в существующий файл, а не заменить его содержимое. Именно здесь опция -a (append, добавление) пригодится.
Понимание опции добавления
Перейдите в проектную директорию, если вы еще не там:
cd /home/labex/project
Сначала создадим файл с информацией о системе:
uname -a | tee system_info.log
Эта команда отобразит информацию о вашей системе в терминале и сохранит ее в файл system_info.log. Вывод будет выглядеть приблизительно так (ваш вывод может отличаться):
Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Теперь проверим содержимое файла:
cat system_info.log
Вы должны увидеть ту же информацию о системе.
Добавление информации в файл
Теперь добавим больше информации в этот файл с использованием опции -a:
echo "Date and time: $(date)" | tee -a system_info.log
Это отобразит что-то вроде:
Date and time: Wed May 3 14:22:34 UTC 2023
Флаг -a сообщает команде tee добавить вывод в файл вместо его перезаписи.
Проверим содержимое файла еще раз:
cat system_info.log
Теперь вы должны увидеть как информацию о системе, так и дату:
Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023
Добавление еще больше информации
Добавим еще больше информации в наш лог-файл:
echo "Disk usage:" | tee -a system_info.log
df -h | tee -a system_info.log
Это отобразит информацию о использовании диска и добавит ее в наш лог-файл. Вывод будет различаться в зависимости от вашей системы, но может выглядеть приблизительно так:
Disk usage:
Filesystem Size Used Avail Use% Mounted on
/dev/root 19G 5.8G 13G 32% /
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 198M 1.1M 197M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda15 105M 5.2M 100M 5% /boot/efi
tmpfs 100M 4.0K 100M 1% /run/user/1000
Проверим содержимое нашего лог-файла еще раз:
cat system_info.log
Теперь вы должны увидеть всю информацию, которую мы добавили:
Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023
Disk usage:
Filesystem Size Used Avail Use% Mounted on
/dev/root 19G 5.8G 13G 32% /
tmpfs 494M 0 494M 0% /dev/shm
tmpfs 198M 1.1M 197M 1% /run
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda15 105M 5.2M 100M 5% /boot/efi
tmpfs 100M 4.0K 100M 1% /run/user/1000
Понимание структуры команды
Синтаксис добавления с использованием tee выглядит так:
command | tee -a filename
Где:
command- любая команда, которая генерирует вывод|(pipe) отправляет вывод команды вteetee- сама команда-a- опция для добавления в файл вместо его перезаписиfilename- имя файла, в который будет добавлен вывод
Этот подход особенно полезен для:
- Построения лог-файлов со временем
- Захвата вывода нескольких команд в одном файле
- Сохранения записи о состояниях или операциях системы
Резюме
В этом практическом занятии вы узнали, как использовать команду tee для мультиплексирования вывода в Linux. Эта мощная утилита позволяет вам просматривать вывод команд в терминале и одновременно сохранять его в файлы, что делает ее незаменимым инструментом для системных администраторов и разработчиков.
Вот основные навыки, которые вы приобрели:
Базовое использование tee: Вы научились использовать
teeдля отображения вывода в терминале и одновременного сохранения его в файл.Перенаправление стандартной ошибки: Вы овладели способом захвата как стандартного вывода, так и стандартной ошибки с использованием перенаправления
2>&1в сочетании сtee, что является важным аспектом комплексного логирования.Добавление вывода: Вы узнали, как использовать опцию
-aсteeдля добавления вывода в существующие файлы вместо их перезаписи, что позволяет создавать логи пошагово.
Эти техники ценны для различных задач в Linux, включая:
- Создание подробных журналов для отладки
- Мониторинг системных активностей
- Документирование вывода команд при системном администрировании
- Сохранение результатов команд для будущего использования
Понимание того, как эффективно управлять выводом в Linux, является фундаментальным навыком, который пригодится вам на протяжении всего пути работы с Linux-системами.



