Потоки данных в Linux: stdin, stdout, stderr

Каждый процесс в Linux имеет три стандартных потока данных: стандартный ввод (stdin), стандартный вывод (stdout) и стандартный поток ошибок (stderr). При работе в оболочке (например, bash или zsh) взаимодействие с процессами происходит следующим образом:

Взаимодействие с процессами

  1. Ввод: Команды, введённые с клавиатуры, поступают в stdin оболочки, которая также является процессом.
  2. Выполнение: Оболочка создаёт новый процесс (например, ls, mkdir) и соединяет свой stdin со stdin нового процесса.
  3. Вывод и ошибки: Потоки stdout и stderr нового процесса по умолчанию соединены с stdout и stderr оболочки. Поэтому вывод команды ls отображается в терминале, а сообщения об ошибках от mkdir — также. Это происходит потому, что stdout и stderr нового процесса перенаправлены на stdout и stderr оболочки, которая затем выводит их на экран.

Например:

  • Запуск ls выводит содержимое текущего каталога, так как stdout процесса ls перенаправлен в stdout оболочки.
  • Запуск mkdir без аргументов выдает сообщение об ошибке, так как stderr процесса mkdir перенаправлен в stderr оболочки.

Перенаправление потоков

Можно изменить это поведение по умолчанию и перенаправить потоки данных. Например, команда ls > файл.txt перенаправляет stdout процесса ls в файл файл.txt. Это изменяет стандартное поведение, перенаправляя поток stdout в файл, а не в оболочку.

Дополнительные сведения

В дальнейшем будет рассказано о числовых идентификаторах stdin, stdout и stderr, а также о том, как одновременно перенаправлять stdout и stderr. Кроме того, будет рассмотрен пример процесса, который принимает данные через stdin, в отличие от ls и mkdir, которые не принимают ввод через stdin.

Что будем искать? Например,программа