Перенаправление потоков в Linux: stdout, stderr и pipe

Photo Ubuntu server

Перенаправление потоков в Linux – база оболочки: stdout, stderr и stdin можно слать в файл, в другую команду или «в никуда». Это нужно для логов, пайплайнов и автоматизации. Ниже операторы, которые реально используют каждый день, и короткие примеры.

Три стандартных потока

  • 0 – stdin – ввод (клавиатура или файл).
  • 1 – stdout – обычный вывод.
  • 2 – stderr – ошибки и диагностика.

По умолчанию 1 и 2 идут в терминал. Разделение удобно: результат – в один файл, ошибки – в другой, или всё вместе.

Основные операторы

  1. > – stdout в файл (файл перезаписывается).
  2. >> – stdout в конец файла (append).
  3. < – содержимое файла на stdin команды.
  4. 2> / 2>> – stderr в файл (overwrite / append).
  5. 2>&1 – stderr туда же, куда сейчас смотрит stdout.
  6. | – pipe: stdout левой команды на stdin правой.

Примеры

Запись и дополнение файла

echo "Привет, мир!" > hello.txt
echo "До свидания, мир!" >> hello.txt

Первая команда создаст или перезапишет hello.txt. Вторая добавит строку в конец.

Ввод из файла

cat < hello.txt
# то же по смыслу для многих утилит: sort < data.csv

У cat есть аргумент-файл, но < показывает именно redirect stdin – удобно в скриптах и с командами, которые читают только stdin.

Только ошибки

ls -l /несуществующий_каталог 2> error.log

Сообщение об ошибке уйдёт в error.log, а не на экран. stdout при успехе по-прежнему в терминал (здесь его почти нет).

Stdout и stderr в один лог

./deploy.sh > deploy.log 2>&1
# в bash часто пишут короче:
./deploy.sh &> deploy.log

Порядок важен: сначала направляете stdout, потом 2>&1. Иначе stderr может уйти не туда.

Pipe

cat hello.txt | grep "Привет"
# типичный пайплайн:
ps aux | grep nginx | grep -v grep

Вывод одной команды – вход следующей. Цепочки grep | sort | uniq – обычный способ разобрать логи без тяжёлых GUI.

Чуть глубже

  • /dev/null – «чёрная дыра»: cmd > /dev/null 2>&1 глушит весь вывод.
  • Here-doc: cat <<EOF ... EOF – многострочный stdin прямо в скрипте.
  • Process substitution (bash): diff <(cmd1) <(cmd2) – сравнение выводов без временных файлов.
  • set -o pipefail в bash-скриптах: пайп падает, если упала любая команда, а не только последняя.

Краткий вывод

Освоив >, >>, 2>, 2>&1 и |, вы контролируете логи, отчёты и обработку данных из shell. Это фундамент админки и CI: меньше ручного копирования из терминала, больше воспроизводимых команд.

Источники и ссылки


Комментарии загружаются…