TGViewer
LinuxCamp | DevOps LinuxCamp | DevOps @linuxcamp_tg · 13.6K subscribers
Post #155 7.04K
Операторы перенаправления ввода-вывода [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
  • 👍 54
  • 🔥 12
  • ❤‍🔥 4
More from @linuxcamp_tg
  1. Sep 28, 2026Проекту GNU вчера исполнилось 43 года 1983 год: Ричард Столлман объявил планы разработать…
  2. Sep 25, 2026Linux будет работать на ноутах с Snapdragon X2. Qualcomm добавляет полноценную поддержку L…
  3. Sep 24, 2026Так все по делу)) Советует же самый быстрый фикс LinuxCamp | #memes
  4. Sep 23, 2026Планы на 3 октября — прийти на RWB Infra x Security Meetup Мы направим прожекторы на инфра…
  5. Sep 22, 2026Ещё одна рекордная неделя для AI-разработки в Linux. На прошлой неделе в ядро попало 1 634…
  6. Sep 17, 2026Открыл плейлист, а как выйти - непонятно 😁 LinuxCamp | #memes
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →