Главная » Программирование для UNIX » Перенаправление ввода−вывода UNIX

0

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

$ ls

выводит список файлов на терминал. Если же ввести

$ ls >filelist

то тот же  самый список будет  выведен не на терминал, а в файл file– list. Символ  >  означает «поместить вывод  в указанный файл  вместо  терминала». Если  такой файл не существовал, он будет создан, а если существовал, то перезаписан. На терминал ничего не выводится. Другой  пример: можно объединить несколько файлов в один, собрав вывод команды cat в файл:

$ cat  f1  f2  f3  >temp

Символ >> обозначает почти такое же действие, как и >, с той лишь раз ницей, что он «дописывает в конец». То есть команда

$ cat  f1  f2  f3  >>temp

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

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

$ mail  mary joe  tom  bob <let

Во всех  вышеприведенных примерах пробелы  с  любой  стороны от > или  < не обязательны, мы же придерживаемся традиционного форматирования.

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

$ who  >temp

$ sort <temp

Так  как who выводит по одной  строке для каждого зарегистрированного  пользователя, а  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

Во всех этих  примерах важно помнить, что интерпретацию символов < и > осуществляет  оболочка (как и интерпретацию символов типа  * в шаблонах имен  файлов), а не конкретные  программы. «Централизация» этой возможности в оболочке означает, что перенаправление ввода и вывода может применяться в любых командах; сама программа и не знает, что происходит что-то необычное.

Из-за этого возникло важное соглашение. Команда

$ sort <temp

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

$ sort temp

но существует отличие. Строка <temp  интерпретируется оболочкой, поэтому  sort не рассматривает имя  temp как аргумент, вместо этого  она сортирует свой стандартный ввод, который оболочка перенаправила таким образом, чтобы  он поступал из файла. Во втором же  примере с командой sort имя  файла temp передается команде как аргумент, sort читает файл и сортирует его. Команда sort может получать в качестве аргументов несколько файлов, например

$ sort temp1 temp2 temp3

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

$ sort ghi

abc def ctld abc def ghi

$

Использование этого принципа будет обсуждаться в следующем разделе.

Упражнение 1.5. Объясните, почему

$ ls >ls.out

включает ls.out в список имен. ~

Упражнение 1.6. Поясните вывод команды

$ wc temp >temp

Если в имени команды будет сделана ошибка, как в

$ woh  >temp

что произойдет? ~

Источник: Керниган Б., Пайк Р., UNIX. Программное окружение. – Пер. с англ. – СПб: Символ-Плюс, 2003. – 416 с., ил.

По теме:

  • Комментарии