Шокирующий трюк для админов: ускоряю Linux в разы с помощью редиректов и пайпов — настолько просто, что не поверите!

KDE Konsole Terminal open on the Kubuntu Focus Ir14.

Кратко по теме

В Linux редиректы и пайпы дают невероятную свободу в работе с выводом команд. Можно сохранять результат в файл или сразу отправлять его другой команде — рассказываю основы, которые реально полезны на практике.

Потоки: что это такое

В Linux любой процесс работает с так называемыми потоками. Есть поток ввода stdin, поток вывода stdout и отдельный для ошибок — stderr. Как у реки, у потока есть источник (откуда берутся данные) и устье (куда они идут).

Обычно ввод поступает с клавиатуры — когда я что-то набираю. А стандартный вывод и ошибки сразу отображаются в терминале.

Я могу перенаправить потоки или объединять их с помощью пайпов. Редирект — это когда вывод отправляется не в терминал, а, например, записывается в файл. Пайп позволяет взять результат одной команды и передать его другой.

Эти инструменты позволяют легко объединять простые команды в мощные цепочки и автоматизировать рутину.

Все способы перенаправления потоков

Самый базовый вариант — переадресовать вывод команды в файл. Это удобно: так можно сохранить важные логи или не упустить длинный вывод.

Например, на тестовом компьютере команда du выдала мне 1380 строк. Я просто слил их в файл.

Redirecting the output from du to a text file.

Обычный знак «больше» просит оболочку отправить stdout du в файл disk-usage.txt — на экране ничего не появляется.

Команда ls показывает, что файл сразу создан, а wc подтверждает — ровно 1380 строк, всё совпадает.

Counting the number of lines in the disk-usage file containing the redirected output from du.

Такой редирект создаёт или перезаписывает файл каждый раз. Если хотите дописать новый вывод — используйте двойной знак «больше» (>>):

Appending redirected output to an existing file.

less с флагом -N (номера строк) покажет: новые строки начинаются строго после 1380-й, ничего не стёрлось.

Verifying the appended data hasn't overwritten any previous entries in the file.

А если при команде возникнет ошибка, то сообщение всё равно окажется в терминале: обычный редирект отправляет только stdout, а stderr остаётся как есть.

Redirecting stdout to a file, but stderr messages are still displayed in the terminal window.

Результаты du попали в results.txt, а ошибка по несуществующему файлу осталась на экране.

Можно явно указать, какой поток куда направить: 1 — stdout, 2 — stderr. Например, отправляем их в разные файлы:

Redirecting stdout to one file, and stderr to another.

А можно и оба потока отправить в один файл:

Redirecting stdout and stderr to the same file.

Теперь всё, включая ошибки, окажется в этом файле.

Если же нужно, чтобы в терминале не появлялось ничего вообще, есть универсальный приём — направьте вывод в файл /dev/null. Он просто «съедает» все данные без остатка:

Sending both stdout and stderr to the /dev/null device file.

Теперь и вывод, и ошибки «исчезают» — даже если файл, который вы хотели удалить, не существует.

И наоборот: можно использовать файл не только для вывода, но и как источник данных для команды через стандартный ввод:

Using redirection to read a file into a command's stdin stream.

Это можно легко соединять с передачей вывода в новый файл.

Using redirection to read a file into a command's stdin stream and send the output to a different file.

Пайпы: как склеить команды в одну цепочку

Пайп — это когда stdout одной команды тут же становится stdin для следующей. Это настоящая суперспособность командной строки: любые задачи реально автоматизировать без лишних телодвижений.

Главный символ — | (вертикальная черта). Например, если набрать ls -R и вывести структуру домашней папки целиком, терминал завалит вас текстом.

Если перенаправить вывод ls в less, листать результат становится удобно и быстро:

The results of a recursive ls command, displayed in the less file viewer.

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

Ещё больше пользы от пайпов


Лучшие трюки для shell-автоматизации — подпишитесь на рассылку!

Например, чтобы узнать, сколько на компьютере учётных записей, я просто соединяю cat и wc. Cat показывает содержимое /etc/passwd, а wc считает строки — одна строка, один аккаунт:

Using wc to count the lines in the /etc/passwd file.

Много аккаунтов? Легко — чтобы увидеть их имена, добавляю к пайпу awk: задаю двоеточие как разделитель, вывожу только первый столбец — и получаю список логинов.

Piping cat output into awk to extract the first field.

Нужно отсортировать логины по алфавиту? Просто добавляю в цепочку sort:

Piping cat through awk and into sort, to obtain a sorted list of account names from /etc/passwd.

Складывай команды как хочешь: цепные каскады рулят!

Мощный пример — сразу четыре команды в цепочке. ps выводит список процессов (с опциями -e всё подряд, -o comm только названия процессов), потом grep ищет нужные — например, все, что связаны с chrome. После этого подаю результат в sort, а uniq -c подсчитывает, сколько раз встретилось каждое имя. То же можно сделать и для Firefox.

Using four piped commands, ps, grep, sort and uniq, to obain a count of the unique process names matching a search clue.

Бесконечные сценарии для автоматизации

Команды можно склеивать пайпами сколько угодно — ограничений практически нет. Имейте в виду: каждая команда запускается в своем подсчёте (subshell), и на современных компьютерах это не проблема. Только если вдруг заметите, что терминал стал притормаживать — попробуйте упростить цепочку или пару секунд подождать.

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка — это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!

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

Также подписывайтесь на нас в:

Алекс Бежбакин
Оцените автора
Добавить комментарий