Операторы перенаправления ввода-вывода [3]
Я же уверен, что 80% из вас когда-то использовали оператор "
|". Он невероятно полезен - позволяет подключить стандартный вывод (
STDOUT) одной команды к стандартному вводу (
STDIN) другой, чтобы первая смогла передать свои выходные данные во вторую.
Вертикальная черта "
|" между командами — это символ канала (
pipe), который реализовывает механизм конвейера (
pipeline).
Посмотрим на самый узнаваемый сценарий работы конвейера - отфильтровать вывод по шаблону:
$ ls /usr/lib | grep nma
libnma.so.0
libnma.so.0.0.0
В результате мы видим не все содержимое директории, а только то, с чем
grep нашел пересечение по шаблону.
Команды обычно и не знают, что являются частью конвейера:
ls считает, что выводит данные на дисплей, хотя на самом деле ее вывод был перенаправлен на
grep, который верит, что читает данные с клавиатуры, когда на самом деле получает вывод
ls:
ls (STDOUT) -> grep (STDIN) -> grep (STDOUT)
Тут уже оболочка, на своем уровне, выполняет всю магию и использует системный вызов "
pipe()" для перенаправления:
#include <unistd.h>
int pipe(int pipefd[2]);
Важно понимать, что любая утилита, которая читает стандартный ввод или записывает вывод, может участвовать в создании конвейера и быть полезна для решения комплексной задачи.
Допустим, мы хотим узнать, сколько подкаталогов находится в "
/usr/lib". Нет простой команды для получения ответа, поэтому создадим конвейер.
Начнем с простого вывода содержимого директории. Обратите внимание, что команда "
ls –l" помечает каталоги буквой "
d" в начале строки:
$ ls -l /usr/lib
drwxrwxr-x ... 4kstogram
drwxr-xr-x ... NetworkManager
Используем
cut, чтобы вывести первый столбец:
$ ls -l /usr/lib | cut -c1
d
d
d
-
-
-
Затем используем
grep, чтобы оставить только строки, содержащие букву "
d":
$ ls -l /usr/lib | cut -c1 | grep d
d
d
d
Наконец, подсчитаем строки с помощью команды
wc и получим ответ, созданный конвейером из четырех команд:
$ ls -l /usr/lib | cut -c1 | grep d | wc -l
145
Результат: директория "
/usr/lib" содержит 145 подкаталогов.
Что мы сделали? Превратили небольшую горстку команд в набор комбинируемых инструментов. Как говорится, целое всегда есть нечто большее, чем сумма его частей.
🐧 LinuxCamp