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

На Linux пайпы и редиректы дают вам мощные способы работать с выводом команд. Сохраните его в файлы или передайте другой команде как ввод. Ниже — всё, что нужно знать.
Что такое потоки?
Каждый процесс в Unix-подобной системе работает с тремя стандартными потоками: stdin (ввод), stdout (вывод) и stderr (ошибки). Поток имеет источник и приёмник: ввод может приходить с клавиатуры, а вывод чаще всего идёт в окно терминала.
- stdin — стандартный ввод (файловый дескриптор 0). Кратко: куда команда читает данные.
- stdout — стандартный вывод (файловый дескриптор 1). Кратко: куда команда пишет результаты.
- stderr — стандартный поток ошибок (файловый дескриптор 2). Кратко: куда команда пишет сообщения об ошибке.
Перенаправление отправляет вывод туда, где его обычно нет. Пайп берёт stdout одной команды и подаёт его в stdin другой. Это основа композиции команд: многие маленькие утилиты могут работать вместе.
Важно: по умолчанию вы перенаправляете только stdout. Ошибки (stderr) останутся на экране, если вы их явно не перенаправите.
Перенаправление потоков
Простейший случай — отправить вывод команды в файл. Это полезно, когда вывод слишком долгий или вы хотите сохранить лог.
du > disk-usage.txt
Один символ “>” означает: перенаправь stdout в указанный файл. Файл создаётся или перезаписывается.
Проверим, что файл создан, и посчитаем строки с помощью wc:
ls
wc disk-usage.txt
Чтобы не перезаписывать, а добавлять в конец, используйте “>>”:
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
Можно явно указать дескрипторы потоков. 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:
wc disk-usage.txt missing-file.txt 1> results.txt 2>&1
cat results.txt
Если вы не хотите никуда сохранять вывод, используйте нулевое устройство /dev/null, которое поглощает всё silently:
rm disk-usage.txt missing-file.txt 1> /dev/null 2>&1
Наконец, можно подать файл как stdin команды с помощью <:
wc < /etc/passwd
И сочетать чтение и запись:
wc < /etc/passwd > results.txt
cat results.txt
Пропуск потоков через конвейеры
Пайп (|) берёт stdout первой команды и подаёт его как stdin второй. Это мощный способ соединять простые инструменты в сложные процессы.
ls -R ~ | less
Это удобнее, чем сначала перенаправлять вывод в файл, а затем открывать файл.
Передача вывода другой команде
Часто вторая команда дополнительно обрабатывает вывод первой. Пример: посчитать количество учётных записей, перечисленных в /etc/passwd.
cat /etc/passwd | wc -l
Чтобы вывести имена учётных записей, используйте awk для разделения полей по двоеточию и печати первого поля:
cat /etc/passwd | awk -F: '{print $1}'
Отсортировать список можно, добавив sort:
cat /etc/passwd | awk -F: '{print $1}' | 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
Бесконечные комбинации
Нет реального ограничения на длину цепочки пайпов. Однако каждая команда запускается в своей подпроцессной среде. На слабой машине длинные цепочки могут вызвать задержки.
Если заметны проблемы с производительностью, попробуйте упростить команду или разбить задачу на этапы с временными файлами.
Как думать о потоках и пайпах — ментальные модели
- «Лента конвейера»: представьте 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 для надёжных скриптов.
Ключевые шаги на практике
- Решите, нужно ли сохранять вывод или передать его дальше.
- Используйте > для перезаписи и >> для добавления.
- Объединяйте stdout и stderr при необходимости с помощью 2>&1.
- Тестируйте с небольшими данными и добавляйте set -o pipefail в автоматизированных скриптах.
Краткое резюме:
- stdout, stderr и stdin — ключ к контролю ввода/вывода.
- Пайпы дают композицию — соединяйте маленькие программы для больших задач.
- Всегда проверяйте права и учитывайте буферизацию при работе с большими данными.
Похожие материалы
Включить тёмную тему в Pinterest — инструкция
Пользовательский курсор в Windows
Как узнать, установлен ли в Mac Intel или Apple Silicon
Evernote → OneNote на Mac: как мигрировать
Как делиться экраном в Zoom — способы и советы