Что такое стандартные потоки stdin, stdout и stderr в Linux

Ответ

В Linux и других UNIX-подобных системах каждая программа при запуске получает три стандартных потока ввода-вывода. Это основной механизм для текстового взаимодействия между программами и терминалом.

  • stdin (standard input) — стандартный поток ввода. По умолчанию связан с клавиатурой. Имеет файловый дескриптор 0.
  • stdout (standard output) — стандартный поток вывода. Сюда направляется обычный вывод программы. По умолчанию связан с терминалом. Дескриптор 1.
  • stderr (standard error) — стандартный поток ошибок. Сюда направляются сообщения об ошибках и диагностическая информация. По умолчанию также связан с терминалом. Дескриптор 2.

Разделение stdout и stderr позволяет перенаправлять обычный вывод программы в файл, но при этом видеть ошибки в консоли.

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

Операторы командной строки позволяют управлять этими потоками:

# Записать вывод команды ls в файл output.txt (перенаправление stdout)
ls -l > output.txt

# Записать ошибки в error.log (перенаправление stderr)
find /root -name "*.py" 2> error.log

# Прочитать данные для команды sort из файла input.txt (перенаправление stdin)
sort < input.txt

# Передать stdout команды 'cat' на stdin команды 'grep' (конвейер)
cat /var/log/syslog | grep 'error'

Пример использования в Python

import sys

# Чтение всех данных из стандартного ввода
for line in sys.stdin:
    # Запись в стандартный вывод
    sys.stdout.write(f"Processed line: {line}")

# Запись ошибки в стандартный поток ошибок
sys.stderr.write("An error occurred!n")