← Назад к вопросам

Что такое stdin\sdtout в Linux?

1.0 Junior🔥 121 комментариев
#Другое

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

stdin, stdout, stderr в Linux

Что это такое?

stdin (Standard Input) — стандартный поток ввода (файловый дескриптор 0) stdout (Standard Output) — стандартный поток вывода (файловый дескриптор 1) stderr (Standard Error) — стандартный поток ошибок (файловый дескриптор 2)

Это три основных потока в Unix/Linux, которые позволяют программе взаимодействовать с операционной системой. Каждому процессу автоматически предоставляются эти три потока при запуске.

Файловые дескрипторы

В Linux всё — это файлы, включая потоки ввода-вывода. Каждый поток имеет номер (дескриптор):

0 = stdin  (вход)
1 = stdout (обычный вывод)
2 = stderr (вывод ошибок)

Практические примеры в Bash

Редирект stdout в файл:

echo "Hello World" > output.txt
echo "Another line" >> output.txt

Редирект stderr в файл:

ls /nonexistent 2> errors.txt
ls /nonexistent 2>> errors.txt

Объединение stdout и stderr:

command > output.txt 2>&1
command &> output.txt

Pipe (конвейер):

ls -la | grep ".txt"
cat file.txt | sort | uniq

Использование в Python

Чтение из stdin:

import sys

line = sys.stdin.readline()
print(f"Вы ввели: {line}")

for line in sys.stdin:
    print(f"Обработка: {line.strip()}")

name = input("Введите имя: ")
print(f"Привет, {name}!")

Вывод в stdout:

import sys

print("Это выводится в stdout")
sys.stdout.write("Привет мир\\n")
sys.stdout.flush()

Вывод в stderr:

import sys

print("Критическая ошибка!", file=sys.stderr)
sys.stderr.write("Ошибка при обработке данных\\n")
sys.stderr.flush()

Фильтр для конвейера

#!/usr/bin/env python3
import sys

for line in sys.stdin:
    line = line.strip()
    if len(line) > 5:
        print(line)
    else:
        print(f"Пропущена короткая строка: {line}", file=sys.stderr)

Работа с процессами (subprocess)

import subprocess

result = subprocess.run(
    ["echo", "Hello World"],
    capture_output=True,
    text=True
)

print("Стандартный вывод:", result.stdout)
print("Ошибки:", result.stderr)
print("Код возврата:", result.returncode)

Пайп между процессами:

import subprocess

process = subprocess.Popen(
    ["cat"],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=True
)

stdout, stderr = process.communicate(
    input="Line 1\\nLine 2\\nLine 3\\n"
)

print("Вывод:", stdout)

Запуск с редирекцией:

import subprocess

with open("input.txt", "r") as stdin_file:
    with open("output.txt", "w") as stdout_file:
        with open("errors.txt", "w") as stderr_file:
            subprocess.run(
                ["python3", "script.py"],
                stdin=stdin_file,
                stdout=stdout_file,
                stderr=stderr_file
            )

Логирование в разные потоки

import sys
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('app.log'),
        logging.StreamHandler(sys.stderr)
    ]
)

logger = logging.getLogger(__name__)

print("Приложение запущено", file=sys.stdout)
logger.error("Ошибка при подключении")
logger.info("Обработка запроса")

Примеры редирекции в Bash

command 1> output.txt          # stdout в файл
command 2> error.txt           # stderr в файл
command 1> output.txt 2> error.txt  # оба в разные
command &> all.txt             # оба в один файл
command 2>&1                   # stderr в stdout
command 2>/dev/null            # игнорируем ошибки
cat file.txt | grep "pattern"  # pipe

Таблица дескрипторов

ДескрипторИмяОписаниеИспользование
0stdinСтандартный входВвод данных
1stdoutСтандартный выходВывод результатов
2stderrСтандартная ошибкаВывод ошибок

Зачем разделять stdout и stderr?

1. Удобство обработки:

command 2>/dev/null > results.txt   # только результаты
command 2> errors.log 1>/dev/null   # только ошибки

2. Логирование:

app.py 1> logs/output.log 2> logs/errors.log

3. Мониторинг:

command 2>&1 | tee errors.log | send_to_monitoring

Практический пример: обработка данных

import sys
import json

try:
    for line in sys.stdin:
        data = json.loads(line)
        result = process(data)
        print(json.dumps(result))  # stdout - результат
except Exception as e:
    print(f"Ошибка: {e}", file=sys.stderr)  # stderr - ошибка
    sys.exit(1)

Использование в конвейере:

cat data.json | python3 process.py > results.json 2> errors.log

Понимание stdin, stdout и stderr — критически важно для работы в Linux, создания скриптов и интеграции приложений в непрерывный процесс обработки данных. Правильное разделение потоков позволяет создавать модульные, легко отлаживаемые и масштабируемые системы.

Что такое stdin\sdtout в Linux? | PrepBro