Вы запускаете команду, видите текст на экране, но когда что-то идёт не так, ошибки могут внезапно «потеряться» или перемешаться с обычными данными. В Linux за это отвечают три стандартных потока — невидимые каналы, связывающие программу с терминалом. Понимание того, как работают эти «трубы», — базовый навык для любого системного администратора или DevOps-инженера.

Три кита ввода-вывода

Каждому процессу в системе при запуске назначаются три стандартных дескриптора файлов:

  • stdin (0) — стандартный ввод. По умолчанию — это ваша клавиатура.
  • stdout (1) — стандартный вывод. По умолчанию данные отправляются на экран.
  • stderr (2) — стандартный поток ошибок. Он также выводится на экран, но идет по отдельному каналу, чтобы ошибки можно было обрабатывать независимо от основного вывода.

Как перенаправлять потоки

С помощью специальных символов вы можете изменять направление этих потоков, сохраняя данные в файлы или читая их из них.

Сохранить стандартный вывод в файл (перезапись):

ls > files.txt

Добавить вывод в конец существующего файла:

ls >> files.txt

Сохранить только сообщения об ошибках:

ls /notexist 2> errors.txt

Объединить потоки и сохранить всё в один файл:

ls /notexist > all.txt 2>&1

Или более современный и краткий вариант:

ls /notexist &> all.txt

Тишина в терминале: использование /dev/null

Иногда вывод скрипта слишком шумный и мешает работе. Чтобы скрыть его, перенаправьте данные в «чёрную дыру» Linux — специальное устройство /dev/null.

./noisy_script > /dev/null 2>&1

Конвейеры (Pipes): Связываем команды

Символ пайпа | передает stdout первой команды на stdin второй. Это позволяет строить мощные цепочки обработки данных.

dmesg | grep usb
journalctl -u nginx | tail -20

Здесь вывод journalctl фильтруется, и мы видим только последние 20 строк.

Перенаправление ввода

Вы также можете заставить команду читать данные не из консоли, а напрямую из файла:

sort < unsorted.txt

Лайфхак: Команда tee

Часто нужно одновременно видеть результат на экране и записывать его в лог. Для этого используется утилита tee, которая дублирует поток.

ls -la | tee listing.txt

Краткая шпаргалка

  • > — перезаписать файл выводом (stdout).
  • >> — дописать вывод в конец файла.
  • 2> — перенаправить только ошибки (stderr).
  • | — передать данные следующей команде.

Запомните магические цифры: 1 — это нормальный результат, 2 — ошибки. По умолчанию > эквивалентно 1>.

Теперь вы не будете удивляться, почему при использовании команды find ошибки «Permission denied» мешают просмотру списка файлов. Просто добавьте 2> /dev/null в конце команды и наслаждайтесь чистым результатом.