Перенаправление вывода в bash: >, >> и tee
TL;DR
Перенаправление вывода в bash позволяет сохранять результаты команд в файлы вместо вывода на экран. Используйте > для перезаписи файла, >> для добавления, а tee — если нужно одновременно видеть вывод в терминале и записать его в файл. Для ошибок перенаправляйте stderr (2>) или объединяйте потоки (2>&1).

Быстрые ссылки
- Вариант один: перенаправить вывод только в файл
- Вариант два: одновременно печатать вывод и записывать его в файл
Когда вы выполняете команду в bash, её стандартный вывод (stdout) по умолчанию печатается в терминал. Bash позволяет перенаправить этот вывод в файл, чтобы просмотреть его позже. Это работает в bash на Linux, macOS и в Ubuntu-подсистеме Windows.
Вариант один: перенаправить вывод только в файл
Чтобы перенаправить вывод команды в файл, используйте оператор > или >> и укажите путь к файлу.
>перенаправляет вывод в файл, заменяя его содержимое.>>перенаправляет вывод в файл, дописывая его в конец.
Технически это перенаправляет stdout — стандартный поток вывода, который обычно идёт на экран.
Простой пример. Команда
lsперечисляет файлы и каталоги в текущем каталоге. Если вы выполните:
ls > /path/to/fileто вывод ls будет записан в указанный файл и не появится в терминале. Файл не обязан существовать заранее — bash создаст его.
Чтобы посмотреть содержимое файла, используйте cat:
cat /path/to/file
Важно: оператор > заменяет содержимое файла. Если нужно собрать вывод нескольких команд в одном файле, используйте >>:
uname -a >> /path/to/fileЕсли файл уже существует, >> добавит вывод в конец. Повторяйте по необходимости, чтобы собирать результаты.

Вариант два: печатать вывод и сохранять в файл одновременно
Если вы хотите видеть вывод в терминале и одновременно сохранять его, используйте команду tee. Синтаксис:
command | tee /path/to/fileЭто заменит содержимое файла (как >). Чтобы дописывать в файл:
command | tee -a /path/to/file
tee полезна при отладке, когда нужно видеть прогресс в реальном времени и сохранить лог.
Часто полезные расширения и примеры
- Перенаправление ошибок (stderr) в отдельный файл:
command 2> /path/to/errors.log- Объединение stdout и stderr в один файл:
command > /path/to/all.log 2>&1В bash также работает сокращённый синтаксис:
command &> /path/to/all.log- Использование
teeдля обеих потоков (stdout и stderr):
command 2>&1 | tee /path/to/all.log- Захват интерактивной сессии целиком — команда
scriptсоздаёт запись всего, что отображается в терминале:
script /path/to/session.log
# работать в терминале, затем exitКогда перенаправление не сработает или будет вводить в заблуждение
- Интерактивные программы, которые напрямую управляют tty (напр., text editors, ncurses), могут вести себя иначе и не отдавать вывод стандартными потоками.
- Буферизация: некоторые программы буферизуют вывод, поэтому файл может обновляться не сразу. Для немедленного вывода используйте
stdbufили настройку приложения. - Двоичные данные и побайтовые потоки: текстовый просмотр может исказить двоичные логи.
- Ограничения прав доступа: если у вас нет прав на запись в указанный путь, перенаправление не сработает.
Альтернативные подходы
- systemd/journald: для сервисов лучше использовать системные логи и конфигурацию юнитов, чем хаотичное перенаправление в файлы.
- Лог-фреймворки и rotatelogs: для долгих логов используйте ротацию и инструмент управления логами.
- remote logging: отправка логов на центральный сервер (rsyslog, fluentd).
Ментальные модели и эвристика
- «>» = заменить, «>>» = добавить. Запомните как одну-строчную опцию для накопления логов.
- Pipes (|) подключают stdout одной команды к stdin другой.
tee— это «разветвитель»: одна ветка идёт на экран, другая — в файл. - stderr — для ошибок; не забудьте перенаправить его, если хотите сохранять сообщения об ошибках.
Шпаргалка (cheat sheet)
- Перезаписать файл:
cmd > file - Добавить в файл:
cmd >> file - Перенаправить ошибки:
cmd 2> errors.log - Объединить потоки:
cmd > all.log 2>&1илиcmd &> all.log - Видеть вывод и сохранять:
cmd | tee file - Видеть вывод, дописывать:
cmd | tee -a file - Полная сессия:
script session.log
Чек-листы по ролям
Администратор:
- Убедиться, что путь для логов доступен
- Настроить ротацию логов (logrotate)
- Проверить права безопасности и SELinux/AppArmor
Разработчик:
- Использовать
teeпри отладке - Перенаправлять stderr для сбора ошибок
- Учесть буферизацию при тестах
DevOps-инженер:
- Интегрировать логи в централизованную систему
- Избегать перезаписи важных логов без ротации
- Автоматизировать проверку целостности лог-файлов
Мини-методология: как логировать вывод команд надежно
- Решите, нужен ли лог локально или централизованный.
- Если локально — выберите
>для одноразовой записи или>>/tee -aдля накопления. - Перенаправьте stderr отдельно или объедините, если важны обе категории сообщений.
- Настройте ротацию логов и мониторинг свободного места.
- Документируйте расположение и формат логов в репозитории/инструкции.
Decision flowchart
flowchart TD
A[Нужно ли видеть вывод в терминале?] -->|Да| B[Использовать tee]
A -->|Нет| C[Перенаправить в файл]
B --> D{Добавлять или перезаписывать?}
C --> D
D -->|Перезаписать| E[Использовать > или tee]
D -->|Добавлять| F[Использовать >> или tee -a]
E --> G[Не забыть про stderr]
F --> G
G --> H[Настроить ротацию и мониторинг]Критерии приёмки
- Логи сохраняются в указанный файл без потери данных
- Ошибки (stderr) не теряются — либо записаны отдельно, либо объединены
- Логи не заполняют диск благодаря ротации
- Права доступа настроены корректно
Примеры ошибок и способы устранения
- Проблема: файл не создаётся — проверьте права и родительскую директорию.
- Проблема: вывод в файл задерживается — вероятна буферизация; используйте
stdbuf -oLили настройте приложение. - Проблема: важные логи перезаписываются — перейдите на
>>или настроьтеtee -a.
Короткий глоссарий
- stdout — стандартный поток вывода
- stderr — стандартный поток ошибок
- pipe — конвейер, соединяющий stdout одной команды со stdin другой
- tee — команда для одновременной печати и записи
Краткое резюме
Перенаправление вывода в bash — базовый, но мощный инструмент для сбора и анализа командного вывода. Выбирайте > для перезаписи, >> для добавления, tee для одновременного вывода и записи. Не забывайте про stderr и настройку ротации логов.
Важно: для долгосрочных и критичных задач логирования используйте системные средства (journald, централизованные лог-системы) и автоматическую ротацию.