Каналы на уровне команд
Большинство пользователей UNIX уже сталкивались с конвейерами команд:
$ pr doc | lр
Этот конвейер организует совместную работу команд pr и lр. Символ | в командной строке сообщает командному интерпретатору, что необходимо создать канал, соединяющий стандартный вывод команды pr
со стандартным вводом команды lр. В результате этой команды на матричный принтер будет выведена разбитая на страницы версия файла doc.
Разобьем командную строку на составные части. Программа pr слева от символа, обозначающего канал, ничего не знает о том, что ее стандартный вывод посылается в канал. Она выполняет обычную запись в свой стандартный вывод, не предпринимая никаких особых мер. Аналогично программа lр
справа выполи чтение точно так же, как если бы она получала свой стандартный ввод с клавиатуры или из обычного файла.[10]
Результат в целом будет таким же, как при выполнении следующей последовательности команд:
$ pr doc > tmpfile
$ lр < tmpfile
$ rm tmpfile
Управление потоком в канале осуществляется автоматически и прозрачно для процесса. Поэтому, если программа pr будет выводить информацию слишком быстро, то ее выполнение будет приостановлено. После того как программа lр
догонит программу pr, и количество данных, находящихся в канале, упадет до приемлемого уровня, выполнение программы pr
продолжится.
Каналы являются одной из самых сильных и характерных особенностей ОС UNIX, доступных даже с уровня командного интерпретатора. Они позволяют легко соединять между собой произвольные последовательности команд. Поэтому программы UNIX могут разрабатываться как простые инструменты, осуществляющие чтение из стандартного ввода, запись в стандартный вывод и выполняют одну, четко определенную задачу. При помощи каналов из этих основных блоков могут быть построены более сложные командные строки, например, команда
$ who | wc -l
направляет вывод программы who в программу подсчета числа слов wc, а задание параметра -l
в программе wc
определяет, что необходимо подсчитывать только число строк. Таким образом, в конечном итоге программа
wc выводит число находящихся в системе пользователей (иногда нужно исключить из суммы первую строку-заголовок вывода who).