Кратко по теме
В Linux редиректы и пайпы дают невероятную свободу в работе с выводом команд. Можно сохранять результат в файл или сразу отправлять его другой команде — рассказываю основы, которые реально полезны на практике.
Потоки: что это такое
В Linux любой процесс работает с так называемыми потоками. Есть поток ввода stdin, поток вывода stdout и отдельный для ошибок — stderr. Как у реки, у потока есть источник (откуда берутся данные) и устье (куда они идут).
Обычно ввод поступает с клавиатуры — когда я что-то набираю. А стандартный вывод и ошибки сразу отображаются в терминале.
Я могу перенаправить потоки или объединять их с помощью пайпов. Редирект — это когда вывод отправляется не в терминал, а, например, записывается в файл. Пайп позволяет взять результат одной команды и передать его другой.
Эти инструменты позволяют легко объединять простые команды в мощные цепочки и автоматизировать рутину.
Все способы перенаправления потоков
Самый базовый вариант — переадресовать вывод команды в файл. Это удобно: так можно сохранить важные логи или не упустить длинный вывод.
Например, на тестовом компьютере команда du выдала мне 1380 строк. Я просто слил их в файл.
Обычный знак "больше" просит оболочку отправить stdout du в файл disk-usage.txt — на экране ничего не появляется.
Команда ls показывает, что файл сразу создан, а wc подтверждает — ровно 1380 строк, всё совпадает.
Такой редирект создаёт или перезаписывает файл каждый раз. Если хотите дописать новый вывод — используйте двойной знак "больше" (>>):
less с флагом -N (номера строк) покажет: новые строки начинаются строго после 1380-й, ничего не стёрлось.
А если при команде возникнет ошибка, то сообщение всё равно окажется в терминале: обычный редирект отправляет только stdout, а stderr остаётся как есть.
Результаты du попали в results.txt, а ошибка по несуществующему файлу осталась на экране.
Можно явно указать, какой поток куда направить: 1 — stdout, 2 — stderr. Например, отправляем их в разные файлы:
А можно и оба потока отправить в один файл:
Теперь всё, включая ошибки, окажется в этом файле.
Если же нужно, чтобы в терминале не появлялось ничего вообще, есть универсальный приём — направьте вывод в файл /dev/null. Он просто "съедает" все данные без остатка:
Теперь и вывод, и ошибки "исчезают" — даже если файл, который вы хотели удалить, не существует.
И наоборот: можно использовать файл не только для вывода, но и как источник данных для команды через стандартный ввод:
Это можно легко соединять с передачей вывода в новый файл.
Пайпы: как склеить команды в одну цепочку
Пайп — это когда stdout одной команды тут же становится stdin для следующей. Это настоящая суперспособность командной строки: любые задачи реально автоматизировать без лишних телодвижений.
Главный символ — | (вертикальная черта). Например, если набрать ls -R и вывести структуру домашней папки целиком, терминал завалит вас текстом.
Если перенаправить вывод ls в less, листать результат становится удобно и быстро:
Это на порядок удобнее, чем сперва писать вывод в файл, а потом его отдельно открывать.
Ещё больше пользы от пайпов
Лучшие трюки для shell-автоматизации — подпишитесь на рассылку!
Например, чтобы узнать, сколько на компьютере учётных записей, я просто соединяю cat и wc. Cat показывает содержимое /etc/passwd, а wc считает строки — одна строка, один аккаунт:
Много аккаунтов? Легко — чтобы увидеть их имена, добавляю к пайпу awk: задаю двоеточие как разделитель, вывожу только первый столбец — и получаю список логинов.
Нужно отсортировать логины по алфавиту? Просто добавляю в цепочку sort:
Складывай команды как хочешь: цепные каскады рулят!
Мощный пример — сразу четыре команды в цепочке. ps выводит список процессов (с опциями -e всё подряд, -o comm только названия процессов), потом grep ищет нужные — например, все, что связаны с chrome. После этого подаю результат в sort, а uniq -c подсчитывает, сколько раз встретилось каждое имя. То же можно сделать и для Firefox.
Бесконечные сценарии для автоматизации
Команды можно склеивать пайпами сколько угодно — ограничений практически нет. Имейте в виду: каждая команда запускается в своем подсчёте (subshell), и на современных компьютерах это не проблема. Только если вдруг заметите, что терминал стал притормаживать — попробуйте упростить цепочку или пару секунд подождать.
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Премиум подписка - это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь
Также подписывайтесь на нас в:
- Telegram: https://t.me/gergenshin
- Youtube: https://www.youtube.com/@gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru