UNIX — универсальная среда программирования - Керниган Брайан Уилсон Страница 40
- Категория: Компьютеры и Интернет / Интернет
- Автор: Керниган Брайан Уилсон
- Страниц: 187
- Добавлено: 2020-09-17 00:34:49
UNIX — универсальная среда программирования - Керниган Брайан Уилсон краткое содержание
Прочтите описание перед тем, как прочитать онлайн книгу «UNIX — универсальная среда программирования - Керниган Брайан Уилсон» бесплатно полную версию:UNIX — универсальная среда программирования - Керниган Брайан Уилсон читать онлайн бесплатно
Иногда программы осуществляют вывод в стандартный поток диагностики, даже если они работают правильно. Типичным примером является программа time, которая выполняет команду и выдает в стандартный поток диагностики сообщение о том, сколько времени заняло выполнение:
$ time wc ch3.1
931 4288 22691 ch3.1
real 1.0
user 0.4
sys 0.4
$ time wc ch3.1 >wc.out
real 2.0
user 0.4
sys 0.3
$ time wc ch3.1 >wc.out 2>time.out
$ cat time.out
real 1.0
user 0.4
sys 0.3
$
Конструкция 2> имя_файла (между 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
$
Программирующие на языке shell называют такую конструкцию "документ здесь", т.е. входной поток находится здесь, а не в каком-нибудь файле. Началом конструкции служит <<; последующее слово (в нашем примере End) является ограничителем входного потока, включающего все строки до той, которая содержит только данное слово. Интерпретатор выполняет замену конструкций $, `...` и \ в "документе здесь", если только часть слова не экранирована кавычками или обратной дробной чертой, — в этом случае весь документ берется без изменений. В конце главы мы рассмотрим еще более интересный пример с конструкцией "документ здесь".
В табл. 3.2 перечислены различные виды переключения ввода-вывода, допускаемые интерпретатором.
> файл Переключение стандартного выходного потока в файл >> файл Добавление стандартного выходного потока в файл < файл Получение стандартного выходного потока из файла p1 | p2 Передача стандартного выходного потока программы p1 в качестве входного потока для программы p2 ^ Устарелый синоним | n> файл Переключение выходного потока из файла с дескриптором n в файл n>> файл Добавление выходного потока из файла с дескриптором n в файл n>&m Слияние выходных потоков файлов с дескрипторами n и m <<s "Документ здесь": берется стандартный входной поток до строки, начинающейся с s; выполняется подстановка для $, `...` и \ <<\s "Документ здесь" без подстановки <<'s' "Документ здесь" без подстановкиТаблица 3.2: Переключение ввода-вывода интерпретатора
Упражнение 3.14Сравните версии программы 411: использующую "документ здесь" и первоначальную. Какую легче сопровождать? Какая более подходит в качестве основы общего служебного средства?
3.8 Циклы в shell-программах
Язык shell — действительно язык программирования: в нем есть переменные, циклы, ветвления и т.п. Здесь мы обсудим основные циклы, а структуры управления рассмотрим более подробно в гл. 5.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.