Каждый процесс в Linux имеет три стандартных потока данных: стандартный ввод (stdin), стандартный вывод (stdout) и стандартный поток ошибок (stderr). При работе в оболочке (например, bash или zsh) взаимодействие с процессами происходит следующим образом:
Взаимодействие с процессами
- Ввод: Команды, введённые с клавиатуры, поступают в stdin оболочки, которая также является процессом.
- Выполнение: Оболочка создаёт новый процесс (например, ls, mkdir) и соединяет свой stdin со stdin нового процесса.
- Вывод и ошибки: Потоки 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.