Конвейеры

Предположим, что нам необходимо выполнить две программы: prog1 и prog2. Причем, то что prog1 выводит на стандартный вывод необходимо передать на стандартный ввод prog2. Для этого можно выполнить следующие команды:

$ prog1 > tmp
$ prog2 < tmp
$ rm tmp
$

То есть сначала сохраняем во временном файле стандартный вывод программы prog1. А при запуске prog2 перенаправляем содержимое файла на её стандартный ввод. Затем удаляем временный файл.

Для передачи данных со стандартного вывода одной программы на стандартный ввод другой программы в Linux предусмотрен механизм называемый конвейером команд. Для создания такого конвейера используется символ |.

prog1 | prog2

Рассмотрим простой пример.

$ ls -l | sort > sorted
$

Результат работы программы ls (список файлов) передаётся по конвейеру на стандартный вход программы sort. При этом список файлов не попадает на экран терминала. Программа sort сортирует файл по строкам. Поскольку у sort перенаправлен стандартный вывод, информация на экран не попадает, а передаётся в файл sorted. То есть в результате выполнения этого конвейера команд, в файле sorted сохраняется отсортированный список файлов.

Длина конвейера команд ограничена только размером командной строки. То есть можно добавить к конвейеру третью, четвертую, пятую и т.д. программы.

На примере конвейеров команд хорошо виден так называемый путь UNIX (UNIX way). В UNIX редко встречаются универсальные программы, которые умеют делать все. Существует большое количество небольших программ. Каждая программа хорошо делает определённое действие: хорошо сортирует файлы, хорошо фильтрует данные и т.д. Все программы умеют работать со стандартными вводом и выводами. Объединяя эти программы в конвейер команд, в результате мы получаем обработку данных без написания новой программы. Таким образом, по разному комбинируя программы в конвейере, можно получить различные результаты.