Читать книгу 📗 "UNIX — универсальная среда программирования - Керниган Брайан Уилсон"
$ who > temp$ wc -l < tempи число файлов в текущем каталоге:
$ ls > temp$ wc -l < tempхотя в это число войдет и сам файл
temp$ ls > temp$ pr -3 < tempНаконец, можно убедиться в том, что некий пользователь вошел в систему, комбинируя команды
whogrep$ who > temp$ grep mary < tempВо всех перечисленных выше примерах, как и в случае имен файлов, содержащих образы типа
*<>shellИзложенное подводит нас к важному выводу. Команда
$ sort < tempсортирует содержимое файла
temp$ sort tempно в их действиях есть различие. Поскольку строка
< tempshellsorttemptemp$ sort temp1 temp2 temp3но, если имена файлов отсутствуют, она всегда будет сортировать стандартный входной поток. Это существенная особенность большинства команд: если не указаны имена файлов, то обрабатывается стандартный входной поток. Следовательно, достаточно ввести имя команды, чтобы посмотреть, как она выполняется. Например,
$ sortghiabcdefctl-cabcdefghi$В дальнейшем мы покажем, как реализуется этот принцип.
Объясните, почему команда
$ ls > ls.outвключает
ls.outОбъясните результат выполнения команды
$ wc temp > tempЧто произойдет, если вы ошибетесь в имени команды, задав
$ woh > tempВсе примеры, приведенные в конце предыдущего раздела, основаны на одном и том же приеме: выходной поток одной программы передается в качестве входного потока для другой программы через временный файл. Сам временный файл больше не имеет никакого смысла; в самом деле, неудобно использовать такой файл. Это соображение привело к возникновению одной из фундаментальных концепций системы UNIX, идеи программного канала. Программный канал представляет собой средство связи выходного потока одной программы с входным потоком другой без всяких временных файлов; соединение программным каналом двух или более программ называется конвейером.
Пересмотрим теперь некоторые из предыдущих примеров с точки зрения использования программных каналов вместо временных файлов. Вертикальная черта служит указанием интерпретатору
shell$ who | sort $ who | wc -l $ ls | wc -l $ ls | pr -3 $ who | grep mary Всякая программа, вводящая информацию с терминала, может вводить ее и по программному каналу; всякая программа, производящая вывод на терминал, может выдавать информацию в программный канал. Это тот случай, когда приносит плоды решение читать стандартный входной поток, если не заданы никакие файлы. Любая программа, выполняющая данное соглашение, может быть включена в конвейер. В рассмотренных выше примерах команды
prgrepsortwcМожно связать конвейером сколь угодно много программ. Например,
$ ls | pr -3 | lprсоздает список имен файлов в три столбца и выдает его на печатающее устройство, а
$ who | grep mary | wc -lподсчитывает, сколько раз пользователь Мэри входила в систему.
Программы, связанные конвейером, выполняются одновременно, а не последовательно одна за другой. Это означает, что программы в конвейере могут вступать в диалог; ядро выполняет необходимые операции переключения и синхронизации, чтобы такая схема работала. Большинство команд следует определенному образцу, поэтому они хорошо вписываются в конвейер и могут выполняться в нем на любом месте. Обычный вызов команды имеет вид:
<i>команда флаги возможные имена файлов</i>Если имена файлов не указаны, то команда читает стандартный входной поток, который по умолчанию поступает с терминала (что удобно для экспериментирования), однако возможно его переключение на файл или программный канал. Кроме того, во многих командах выдача идет в стандартный выходной поток, который по умолчанию направлен на терминал, но его также можно переключить на файл или программный канал.
Сообщения же об ошибках, выдаваемые командами, следует обрабатывать по-другому, иначе они затеряются в файле или программном канале. Поэтому каждая команда имеет еще один стандартный файл, называемый файлом диагностики, который обычно связан с вашим терминалом:

Рис. 1.2: Схема потоков в UNIX
Почти все рассматривавшиеся выше команды укладываются в эту схему; исключение составляют
whodatecmpdiff'-'