Потоки ввода-вывода в Linux: Понимаем stdin, stdout и stderr
Вы запускаете команду, видите текст на экране, но когда что-то идёт не так, ошибки могут внезапно «потеряться» или перемешаться с обычными данными. В 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 в конце команды и наслаждайтесь чистым результатом.