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

0

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

$ diff file1  fiel2  >diff.out

diff: fiel2:  No  such  file  or  directory

$

И в самом  деле желательно, чтобы сообщения об ошибках обрабатывались  именно так, ведь вряд ли можно назвать удачным способ, при котором сообщения исчезали бы в файле diff.out, оставляя пользователя в полной уверенности, что команда отработала правильно.

При запуске любой программы по умолчанию порождаются три файла, пронумерованные небольшими целыми числами, которые называются дескрипторами файла (вернемся к ним в главе 7). Стандартный ввод, 0, и стандартный вывод, 1, с которыми мы уже хорошо знакомы, часто перенаправляются в файлы и каналы. Последний файл с номером 2 – это стандартный вывод  ошибок, который обычно  попадает на терминал.

Иногда  программы  производят  вывод   в  файл  стандартного вывода ошибок, даже если работают правильно. Так поступает программа time, которая выполняет команду и записывает  время исполнения в стан дартный вывод ошибок:

$ time  wc ch3.1

931     4288     22691 ch3.1

>wc.out

$ time  wc ch3.1  >wc.out  2>time.out

$ cat  time.out

real

1.0

user

0.4

sys

0.3

$

Конструкция 2>имя5файла  (пробелы между 2 и знаком > недопустимы) направляет стандартный вывод  ошибок в файл; она синтаксически тяжеловесна, но функцию свою выполняет. (Программа time в нашем коротком тесте выводит не очень  точное  время; но если проводить серию  длительных тестов, то полученные цифры будут  полезными и достаточно достоверными, так что может возникнуть желание сохранить их для последующего анализа; см. табл. 8.1.)

Также существует возможность объединения двух выходных потоков:

$ time  wc ch3.1  >wc.out  2>&1

$ cat  wc.out

931     4288     22691 ch3.1

real

1.0

user

0.4

sys

0.3

$

Запись 2>&1 говорит оболочке, что следует поместить вывод  стандартных  ошибок в тот же поток, что и стандартный вывод. Это не какое-то дополнительное мнемоническое значение  амперсанда, а  просто  иди ома,  которую надо запомнить. Можно использовать и 1>&2  – для того, чтобы добавить стандартный вывод  к стандартному выводу ошибок:

echo … 1>&2

выводит данные на стандартный вывод  ошибок. В командных файлах таким способом предотвращается исчезновение сообщений в каналах или файлах.

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

$ cat  411

grep  "$*"  <<End dial–a–joke    212–976–3838 dial–a–prayer    212–246–4200 dial  santa    212–976–3636

dow  jones  report   212–976–4141

End

$

На жаргоне оболочки такая конструкция называется встроенным до5 кументом (here document); это означает, что входные данные находятся там же, где и сама  команда, а не в каком-то отдельном файле. Символ  << обозначает эту  конструкцию; слово, следующее за  ним  (в данном примере – End), служит для того, чтобы  ограничить ввод, который понимается как все,  что предшествует такому слову, находящемуся в отдельной строке. Оболочка заменяет символы $, `…` и \ во входных

данных встроенного документа, если  только  какая-то часть  слова  не заключена в кавычки  или  не  использована обратная косая черта; в этом случае весь документ воспринимается буквально.

В конце главы мы вернемся к встроенным документам и приведем гораздо  более интересные примеры их использования.

В табл. 3.2  приведен список различных обозначений для перенаправления ввода-вывода, понятных оболочке.

Упражнение 3.14.  Сравните программу 411, содержащую встроенный документ, с ее первоначальной версией. Какую из них легче поддерживать? Какую лучше использовать для создания всеобщей службы? ~

Таблица 3.2. Перенаправление ввода5вывода в оболочке

Обозначение

Действие

>file

>>file

<file p1|p2

^

n>file n>>file  n>&m

n<&m

<<s

<<\s

<<‘s

направляет стандартный вывод в file добавляет стандартный вывод в file получает стандартный ввод из file

соединяет стандартный вывод программы p1  со вводом  p2

устаревший синоним для  |

прямой вывод  из файлового дескриптора n в file

добавляет вывод  из файлового дескриптора n в file

объединяет вывод  из  файлового  дескриптора n  с  файловым дескриптором m

объединяет ввод  из  файлового  дескриптора n  с  файловым дескриптором m

встроенный документ: получает стандартный ввод до тех пор, пока в начале строки не встретится s; обрабатываются символы $, `…` и \

встроенный документ без подстановок встроенный документ без подстановок

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

По теме:

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