UNIX — универсальная среда программирования | страница 30



действует подобно >>, но указывает на необходимость добавить выходной поток к концу файла. Значит, команда

>$ cat f1 f2 f3 >> temp

сольет содержимое >f1, >f2, >f3 и добавит результат в конец >temp, вместо того чтобы затереть его старое содержимое. Так же как и для операции >>, если файл >temp не существует, то он будет создан первоначально пустым.

Аналогично символ >< означает, что входной поток программы берется из последующего файла, а не с терминала. Так, можно заготовить письмо в файле >let, а затем послать его нескольким адресатам:

>$ mail mary joe torn bob < let

Во всех этих примерах наличие пробелов по обе стороны символа >> или >< не обязательно, но такое представление традиционно.

Имея возможность переключать выходной поток с помощью ><, мы можем комбинировать команды, получая эффект, недостижимый другим способом. Например, можно выдать список пользователей в алфавитном порядке

>$ who > temp

>$ sort < temp

Поскольку команда >who выдает по одной строке на каждого пользователя, работающего в системе, a >wc -l производит подсчет строк (подавляя вывод числа слов и символов), можно подсчитать число пользователей с помощью команд:

>$ who > temp

>$ wc -l < temp

и число файлов в текущем каталоге:

>$ ls > temp

>$ wc -l < temp

хотя в это число войдет и сам файл >temp. Можно выдать список имен файлов в три столбца, задав

>$ ls > temp

>$ pr -3 < temp

Наконец, можно убедиться в том, что некий пользователь вошел в систему, комбинируя команды >who и >grep:

>$ who > temp

>$ grep mary < temp

Во всех перечисленных выше примерах, как и в случае имен файлов, содержащих образы типа >*, важно понимать, что символы >< и >> обрабатываются самим интерпретатором >shell, а не отдельной программой. Благодаря этому переключение входного и выходного потоков возможно для любой программы, причем сама программа даже "не подозревает", что происходит что-то необычное.

Изложенное подводит нас к важному выводу. Команда

>$ sort < temp

сортирует содержимое файла >temp так же, как

>$ sort temp

но в их действиях есть различие. Поскольку строка >< temp обрабатывается интерпретатором >shell, первая команда >sort не воспринимает файл >temp как свой аргумент; она просто сортирует собственный стандартный входной поток, который переключен интерпретатором на файл >temp. В то же время в последнем случае имя temp передается команде sort в качестве аргумента, она читает его и сортирует файл. Команде sort можно передать список файлов:

>$ sort temp1 temp2 temp3

но, если имена файлов отсутствуют, она всегда будет сортировать стандартный входной поток. Это существенная особенность большинства команд: если не указаны имена файлов, то обрабатывается стандартный входной поток. Следовательно, достаточно ввести имя команды, чтобы посмотреть, как она выполняется. Например,