Иногда программы осуществляют вывод в стандартный поток диагностики, даже если они работают правильно. Типичным примером является программа time, которая выполняет команду и выдает в стандартный поток диагностики сообщение о том, сколько времени заняло выполнение:
$ time wc ch3.1931 4288 22691 ch3.1real 1.0user 0.4sys 0.4$ time wc ch3.1 >wc.outreal 2.0user 0.4sys 0.3$ time wc ch3.1 >wc.out 2>time.out$ cat time.outreal 1.0user 0.4sys 0.3$Конструкция
2> имя_файла2>timeДопустимо также слияние двух выходных потоков:
$ time wc ch3.1 >wc.out 2>&1$ cat wc.out931 4288 22691 ch3.1real 1.0user 0.4sys 0.3$Обозначение
2>&11>&2echo ... 1>&2В командных файлах это позволяет предотвратить исчезновение сообщений в файле или программном канале.
Интерпретатор предоставляет возможность размещать стандартный входной поток вместе с командой, а не в отдельном файле, так что командный файл может хранить всю информацию в себе самом. Наша справочная программа
411$ cat 411grep "$*" <<Enddial-a-joke 212-976-3838dial-a-prayer 212-246-4200dial santa 212-976-3636dow jones report 212-976-4141End$Программирующие на языке
shell<<End$`...`\В табл. 3.2 перечислены различные виды переключения ввода-вывода, допускаемые интерпретатором.
> файл | Переключение стандартного выходного потока в файл |
>> файл | Добавление стандартного выходного потока в файл |
< файл | Получение стандартного выходного потока из файла |
p1 | p2 | Передача стандартного выходного потока программы p1p2 |
^ | Устарелый синоним | |
n> файл | Переключение выходного потока из файла с дескриптором n в файл |
n>> файл | Добавление выходного потока из файла с дескриптором n в файл |
n>&m | Слияние выходных потоков файлов с дескрипторами nm |
<<s | "Документ здесь": берется стандартный входной поток до строки, начинающейся с s$`...`\ |
<<\s | "Документ здесь" без подстановки |
<<'s' | "Документ здесь" без подстановки |
Таблица 3.2: Переключение ввода-вывода интерпретатора
Сравните версии программы 411: использующую "документ здесь" и первоначальную. Какую легче сопровождать? Какая более подходит в качестве основы общего служебного средства?
3.8 Циклы в shell-программах
Язык
shell