Гид по технологиям

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

7 min read Linux Обновлено 28 Dec 2025
Перенаправление потоков и конвейеры в Linux
Перенаправление потоков и конвейеры в Linux

  • Перенаправление (redirection) позволяет отправлять stdout или stderr в файлы или в /dev/null.
  • Конвейеры (pipes) передают stdout одной команды в stdin другой, что делает возможной простую композицию инструментов.
  • Знайте файловые дескрипторы: 0 — stdin, 1 — stdout, 2 — stderr. Используйте >> для добавления и 2>&1 для объединения потоков.

Быстрые ссылки

  • Что такое потоки?
  • Перенаправление потоков
  • Пропуск потоков через конвейеры
  • Передача вывода другой команде
  • Цепочки из конвейеров
  • Бесконечные комбинации

Краткое резюме

  • Команды Linux используют стандартные потоки: stdin, stdout, stderr.
  • При редиректе вывод отправляется не в окно терминала, а в файл или устройство.
  • Пайпы позволяют связывать команды так, чтобы вывод одной стал вводом другой.

Окно терминала Konsole открыто на ноутбуке Kubuntu Focus Ir14 с Linux.

На Linux пайпы и редиректы дают вам мощные способы работать с выводом команд. Сохраните его в файлы или передайте другой команде как ввод. Ниже — всё, что нужно знать.

Что такое потоки?

Каждый процесс в Unix-подобной системе работает с тремя стандартными потоками: stdin (ввод), stdout (вывод) и stderr (ошибки). Поток имеет источник и приёмник: ввод может приходить с клавиатуры, а вывод чаще всего идёт в окно терминала.

  • stdin — стандартный ввод (файловый дескриптор 0). Кратко: куда команда читает данные.
  • stdout — стандартный вывод (файловый дескриптор 1). Кратко: куда команда пишет результаты.
  • stderr — стандартный поток ошибок (файловый дескриптор 2). Кратко: куда команда пишет сообщения об ошибке.

Перенаправление отправляет вывод туда, где его обычно нет. Пайп берёт stdout одной команды и подаёт его в stdin другой. Это основа композиции команд: многие маленькие утилиты могут работать вместе.

Важно: по умолчанию вы перенаправляете только stdout. Ошибки (stderr) останутся на экране, если вы их явно не перенаправите.

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

Простейший случай — отправить вывод команды в файл. Это полезно, когда вывод слишком долгий или вы хотите сохранить лог.

du > disk-usage.txt

Перенаправление вывода du в текстовый файл disk-usage.txt.

Один символ “>” означает: перенаправь stdout в указанный файл. Файл создаётся или перезаписывается.

Проверим, что файл создан, и посчитаем строки с помощью wc:

ls
wc disk-usage.txt

Подсчёт количества строк в файле disk-usage.txt, содержащем вывод du.

Чтобы не перезаписывать, а добавлять в конец, используйте “>>”:

ls /home/dave-mckay/ -R >> disk-usage.txt
wc disk-usage.txt

Добавление перенаправленного вывода в существующий файл.

less с опцией нумерации подтверждает, что новые строки добавлены после старых.

Проверка, что добавленные данные не перезаписали предыдущие записи.

Если команда генерирует ошибки, вы увидите их в терминале, потому что > перенаправляет только stdout.

wc disk-usage.txt missing-file.txt > results.txt
# Вы увидите: wc: missing-file.txt: No such file or directory
cat results.txt

Перенаправление stdout в файл, но stderr всё ещё отображается в терминале.

Можно явно указать дескрипторы потоков. 1 — stdout, 2 — stderr.

wc disk-usage.txt missing-file.txt 1> results.txt 2> error.txt
cat results.txt
cat error.txt

Перенаправление stdout в один файл, а stderr в другой.

Чтобы записать оба потока в один файл, перенаправьте stdout, затем отправьте stderr в тот же указатель, что и stdout:

wc disk-usage.txt missing-file.txt 1> results.txt 2>&1
cat results.txt

Перенаправление stdout и stderr в один файл results.txt.

Если вы не хотите никуда сохранять вывод, используйте нулевое устройство /dev/null, которое поглощает всё silently:

rm disk-usage.txt missing-file.txt 1> /dev/null 2>&1

Отправка stdout и stderr в устройство /dev/null при удалении файлов.

Наконец, можно подать файл как stdin команды с помощью <:

wc < /etc/passwd

Использование редиректа для чтения файла в stdin команды wc.

И сочетать чтение и запись:

wc < /etc/passwd > results.txt
cat results.txt

Чтение файла в stdin и запись вывода в другой файл.

Пропуск потоков через конвейеры

Пайп (|) берёт stdout первой команды и подаёт его как stdin второй. Это мощный способ соединять простые инструменты в сложные процессы.

ls -R ~ | less

Результат рекурсивного ls, показанный в просмотрщике less.

Это удобнее, чем сначала перенаправлять вывод в файл, а затем открывать файл.

Передача вывода другой команде

Часто вторая команда дополнительно обрабатывает вывод первой. Пример: посчитать количество учётных записей, перечисленных в /etc/passwd.

cat /etc/passwd | wc -l

Использование wc для подсчёта строк в /etc/passwd.

Чтобы вывести имена учётных записей, используйте awk для разделения полей по двоеточию и печати первого поля:

cat /etc/passwd | awk -F: '{print $1}'

Piping вывода cat в awk для извлечения первого поля.

Отсортировать список можно, добавив sort:

cat /etc/passwd | awk -F: '{print $1}' | sort

Piping cat через awk и sort для получения отсортированного списка имён учётных записей.

Цепочки из конвейеров

Вот пример из четырёх команд, связанных тремя пайпами. ps перечисляет запущенные процессы. Опция -o comm выводит только имя команды. Затем grep фильтрует по ключевому слову, sort сортирует, а uniq -c подсчитывает повторы.

ps -e -o comm | grep chrome | sort | uniq -c
ps -e -o comm | grep firefox | sort | uniq -c

Использование ps, grep, sort и uniq для подсчёта процессов по имени.

Бесконечные комбинации

Нет реального ограничения на длину цепочки пайпов. Однако каждая команда запускается в своей подпроцессной среде. На слабой машине длинные цепочки могут вызвать задержки.

Если заметны проблемы с производительностью, попробуйте упростить команду или разбить задачу на этапы с временными файлами.


Как думать о потоках и пайпах — ментальные модели

  • «Лента конвейера»: представьте stdout одной команды как ленту, которая движется и подаётся на вход следующей машины. Каждая машина выполняет свою простую операцию.
  • «Фильтр и сортировщик»: используйте grep как фильтр, awk/sed как трансформер и sort/uniq как агрегатор.
  • «Файловые дескрипторы как адреса»: 0, 1, 2 — это как почтовые ящики, в которые можно положить или из которых можно читать сообщения.

Быстрая справка — Cheat sheet

  • Перезаписать файл: cmd > file
  • Добавить в файл: cmd >> file
  • Перенаправить stderr: cmd 2> error.txt
  • Перенаправить stdout и stderr в один файл: cmd > all.txt 2>&1
  • Отправить вывод в /dev/null: cmd > /dev/null 2>&1
  • Подать файл на stdin: cmd < file
  • Пайп между командами: cmd1 | cmd2 | cmd3
  • Посмотреть процессы: ps -e -o comm | sort | uniq -c

Примеры полезных комбинаций:

# Найти 10 самых больших каталогов в текущем каталоге
du -sh * 2>/dev/null | sort -hr | head -n 10

# Подсчитать уникальные IP в лог-файле
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nr

Когда это не работает или опасно

  • Порядок выполнения: некоторые команды читают ввод полностью до начала вывода, что меняет поток данных и может потребовать временного файла.
  • Большие данные: длинные трубы с утилитами, которые буферизуют результаты, могут потреблять много памяти.
  • Права доступа: редирект в файл выполняется оболочкой от вашего пользователя. Если у вас нет прав на запись, команда не создаст файл.
  • Побочные эффекты: команды вроде rm — осторожно при комбинировании с переменными.

Важно: при использовании sudo перенаправления вида sudo echo “text” > /root/file не сработают как ожидается, потому что перенапправление выполняет оболочка текущего пользователя. Используйте sudo tee:

echo "content" | sudo tee /root/file > /dev/null

Альтернативные подходы

  • Используйте временные файлы (/tmp или mktemp), если поток слишком большой или нужны промежуточные результаты.
  • Используйте процессные заменители (bash >() или <()) для сложных комбинаций без временных файлов.
  • Применяйте более мощные инструменты (Python, awk, perl) для сложной логики, когда комбинация утилит становится громоздкой.

Чек-лист по ролям

Sysadmin

  • Проверить права записи перед редиректом.
  • Логи ошибок перенаправлять в отдельный файл.
  • Использовать ротацию логов для больших файлов.

Разработчик

  • Тестировать команды на небольших данных.
  • Использовать set -o pipefail в скриптах, чтобы получить корректный код возврата при ошибках в пайпе.

DevOps

  • Автоматизировать проверки на диск и память при больших пайплайнах.
  • Логи собирать и централизовать.

Тестировщик

  • Проверить поведение при отсутствии файлов и прав.
  • Добавить сценарии с /dev/null и пустыми вводами.

Факты и полезные числа

  • Стандартные дескрипторы: 0 (stdin), 1 (stdout), 2 (stderr).
  • /dev/null — устройство, которое отбрасывает любые данные.
  • set -o pipefail (bash) — делает код возврата пайпа ненулевым при ошибке любой команды в цепочке.

Примеры и сниппеты — подборка

# Объединить stdout и stderr в файл и затем просмотреть последние 50 строк
your_command > combined.log 2>&1
tail -n 50 combined.log

# Использовать process substitution для сравнения вывода двух команд
diff <(cmd1) <(cmd2)

# В скрипте — перестать молча игнорировать ошибки в пайпе
set -o pipefail
cmd1 | cmd2 | cmd3

Диаграмма принятия решения (Mermaid)

flowchart TD
  A[Нужен вывод команды?] -->|Да| B{Сохранить или передать дальше}
  B -->|Сохранить в файл| C[Использовать > или >>]
  B -->|Передать следующей команде| D[Использовать | 'pipe']
  C --> E{Нужны ошибки в логе?}
  E -->|Да| F[Добавить 2>&1]
  E -->|Нет| G[Оставить только stdout]
  D --> H{Нужен код возврата всей цепочки}
  H -->|Да| I[set -o pipefail в скрипте]
  H -->|Нет| J[Обычный pipe]

Примеры ошибок и способы их решения

  • Ошибка: «permission denied» при записи в файл от root. Решение: используйте sudo tee или выполните команду под нужным пользователем.
  • Ошибка: команда в пайпе не видит результат, потому что предыдущая команда буферизует вывод. Решение: используйте утилиты, которые не буферизуют вывод, или добавьте явную запись во временный файл.
  • Ошибка: скрипт возвращает 0, хотя одна из команд в пайпе упала. Решение: set -o pipefail.

Краткий глоссарий в одну строку

  • stdin: стандартный ввод (0); stdout: стандартный вывод (1); stderr: поток ошибок (2); /dev/null: «чёрная дыра» для вывода; pipe (|): соединяет stdout→stdin.

Заключение

Перенаправление и пайпы — базовые и при этом очень мощные инструменты командной строки. Они позволяют собирать сложные решения из простых компонентов. Начните с простых примеров, сохраняйте вывод для отладки и помните про файловые дескрипторы и set -o pipefail для надёжных скриптов.

Ключевые шаги на практике

  1. Решите, нужно ли сохранять вывод или передать его дальше.
  2. Используйте > для перезаписи и >> для добавления.
  3. Объединяйте stdout и stderr при необходимости с помощью 2>&1.
  4. Тестируйте с небольшими данными и добавляйте set -o pipefail в автоматизированных скриптах.

Краткое резюме:

  • stdout, stderr и stdin — ключ к контролю ввода/вывода.
  • Пайпы дают композицию — соединяйте маленькие программы для больших задач.
  • Всегда проверяйте права и учитывайте буферизацию при работе с большими данными.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Включить тёмную тему в Pinterest — инструкция
Инструкции

Включить тёмную тему в Pinterest — инструкция

Пользовательский курсор в Windows
Настройка

Пользовательский курсор в Windows

Как узнать, установлен ли в Mac Intel или Apple Silicon
Mac

Как узнать, установлен ли в Mac Intel или Apple Silicon

Evernote → OneNote на Mac: как мигрировать
Продуктивность

Evernote → OneNote на Mac: как мигрировать

Как делиться экраном в Zoom — способы и советы
Руководство

Как делиться экраном в Zoom — способы и советы

Как укротить Twitter — практические приёмы
Социальные сети

Как укротить Twitter — практические приёмы