View in Telegram
Операторы перенаправления ввода-вывода [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
Please open Telegram to view this post
VIEW IN TELEGRAM
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Love Center - Dating, Friends & Matches, NY, LA, Dubai, Global
Find friends or serious relationships easily