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