Конвейер (pipe) - перенаправление ввода-вывода в Linux
В UNIX-подобных операционных системах пользователю открывается огромный простор для перенаправления ввода-вывода команд. В этой статье я постараюсь рассказать, что это такое и с чем это едят
Простым примером перенаправления является pipe (конвейер). Обозначается он символом | (прямая палочка, кто не понял :) ). Используется pipe следующим образом:
команда 1 | команда 2 | команда 3 ...
При таком вызове все данные, которые при обычном запуске команды 1 выводились бы на экран будут поступать на стандартный ввод команды 2, как будто бы мы вводим эти данные с клавиатуры.
Поясню на примере. Введите команду ls -l /
. Вы увидите как на экран будет выведено содержимое корневого каталога.
Теперь давайте перенаправим вывод этой команды на ввод другой команды: grep
, которая ищет во входных данных некоторое сочетание символов. Например, используем такую команду: ls -l / | grep tmp
.
Объясню поподробнее что это значит: команда ls -l /
Выведет содержимое корневого каталога (как мы убедились выше). Дальше данные поступают команде grep tmp
, которая произведет поиск по входным данным (полученным из 1 команды). После чего команда grep
выведет то, что нашла на экран (разумеется, это дело опять можно перенаправить).
Что очень важно отметить, команды исполняются одновременно, то есть все, что поступает на вывод в первой программе немедленно поступает на вход второй, не дожидаясь завершения 1.
Если проводить ассоциации с реальным миром, то можно представить pipe в виде длинной трубы, распооженной вертикально (что-то мне подсказывает, что разработчики системы преставляли себе это именно также, потому и выбрали такое название и символ |). В эту трубу некто (команда 1) сверху кидает яблоки (данные). Второй некто (команда 2) достает из трубы эти яблоки. Ширина трубы не позволяет яблакам менять порядок, то есть в каком порядке они были отправлены командой 1, в таком порядке они будут приняты командой 2. Скорости работы команд также могут различаться. В случаи, если второй некто замешкается, яблоки будут оставаться в трубе, дожидаясь обработки. Если замешкается первый, то второй будет ждать поступления данных.
Пожалуй, это все, что можно сказать про конвейер в Linux.
Моя презентация по теме.