Стандартный ввод, вывод и ошибки

LinuxBeginner
Практиковаться сейчас

Введение

Представьте каждую команду Linux в виде машины. С одной стороны в неё поступают данные, а затем машина их обрабатывает. Но в отличие от простой машины с одним выходом, у команды Linux есть два отдельных канала для вывода данных:

  • Стандартный вывод (stdout) — «хороший канал». Если машина работает правильно, через него поступает готовый результат.
  • Стандартный поток ошибок (stderr) — «плохой канал». Если что-то пошло не так, через него поступают сообщения об ошибках.

По умолчанию оба канала выводят свои данные на экран.

Модель «потоков» — одна из важнейших идей при работе с оболочкой. Команды Linux не просто «печатают текст»: они часто формируют структурированные потоки данных. Когда вы разберётесь в этих потоках, перенаправление и конвейеры станут логичными, а не загадочными.

В этой лабораторной работе вы выполните команды и увидите эти два разных потока в действии.

Стандартный вывод (stdout)

Посмотрим на «хороший канал» в действии.

Мы будем использовать ls — команду для просмотра файлов. Если ls выполняется успешно, она отправляет имена файлов в стандартный вывод.

Выполните команду:

ls -l

Вы должны увидеть список файлов.

Что произошло?

Команда выполнилась успешно, поэтому программа ls отправила список в поток stdout. Ваш терминал отслеживает этот поток и отображает его содержимое.

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

Стандартный поток ошибок (stderr)

Теперь рассмотрим «плохой канал». Стандартный поток ошибок (stderr) предназначен для сообщений об ошибках.

Попросим ls вывести содержимое каталога, которого не существует, чтобы команда сообщила об ошибке.

Выполните команду:

ls -l /nonexistent_directory

Вы увидите сообщение об ошибке.

Что произошло?

Команда завершилась с ошибкой. Вместо stdout она отправила сообщение в поток stderr.

По умолчанию терминал отслеживает оба потока, поэтому выводит сообщение об ошибке так же, как обычный текст.

Именно поэтому начинающие часто считают сообщения об успешном выполнении и сообщения об ошибках «одним и тем же видом вывода». На экране они могут выглядеть одинаково, но внутри системы проходят по разным каналам.

Смешанный вывод

Теперь посмотрим, что произойдёт, если команда создаёт оба потока.

Попросим ls выполнить две операции:

  1. Вывести содержимое текущего каталога . — команда выполнится успешно.
  2. Вывести содержимое /fake — команда завершится с ошибкой.

Выполните команду:

ls -l . /fake

Внимательно изучите вывод. Вы должны увидеть две части:

  1. Сообщение об ошибке для /fake.
  2. Успешный список содержимого каталога ..

Что произошло?

Сообщение об ошибке поступило через поток stderr. Список файлов поступил через поток stdout. Терминал получил оба потока и вывел их на экран.

Это различие крайне важно. В следующей лабораторной работе вы узнаете, как сохранять stdout, игнорируя stderr.

Такое разделение важно не только с теоретической точки зрения. В реальной автоматизации скриптам часто требуется сохранять обычные результаты и одновременно оставлять ошибки видимыми либо записывать ошибки в журналы, не смешивая их с полезными данными.

Итоги

В этой лабораторной работе вы изучили «потоки данных» с помощью аналогии с машиной, у которой есть два канала:

  • Стандартный вывод — канал для обычных результатов.
  • Стандартный поток ошибок — канал для сообщений об ошибках.

По умолчанию Linux выводит оба потока на экран одновременно. Далее вы научитесь разделять их.