Упражнение 4.15
Команда ps
выдает поясняющий заголовок, а команда ls -l
сообщает общее число блоков файла. Прокомментируйте действие команд.
Историческая и библиографическая справка
Хороший обзор алгоритмов сопоставления шаблонов дается в статье Э. Ахо, создателя команды egrep
, "Pattern matching in strings" (Proceedings of the Symposium on Formal Language Theory, Santa Barbara, 1979). Редактор sed
разработан и реализован на базе редактора ed
Л. Мак-Махоном. Язык awk
был разработан и реализован Э. Ахо, П. Вайнбергером и Б. Керниганом, но это решение не очень элегантно. К тому же выбор названия языка по первым буквам имен создателей представляется не вполне удачным. Проект обсуждался в статье авторов "AWK — а pattern scanning and processing language" (Software-Practice and Experience, July, 1978). Язык awk
имеет несколько источников, но, безусловно, некоторые идеи заимствованы из языка Снобол4, редактора sed
, языка проверки условий, разработанного М. Рочкиндом, языковых средств yacc
и lex
и, конечно, языка Си. В действительности сходство между awk
и Си порождает ряд проблем. Язык подобен Си, но они не совпадают: одни конструкции в awk
отсутствуют, другие отличаются от соответствующих конструкций Си неочевидным образом.
В статье Д. Комера "The flat file system FFG: a database system consisting of primitives". (Software — Practice and Experience, Nov., 1982) обсуждается использование интерпретатора и awk
для создания системной базы данных.
Глава 5
Программирование на языке shell
Большинство пользователей считают, что shell
представляет собой диалоговый интерпретатор команд. На самом же деле это язык программирования, в котором каждый оператор инициирует запуск команды. Язык shell
может показаться вам несколько странным, поскольку в нем находят отражение и диалоговый, и программный аспекты выполнения команд. Он формировался по плану, хотя и имеет свою историю. Разнообразие применений языка привело к некоторой незавершенности в деталях, но для его эффективного использования вам и не нужно разбираться во всех нюансах. В данной главе мы рассмотрим основы программирования с помощью shell
на примерах разработки ряда полезных программ. При изучении материала желательно иметь под рукой страницу sh(1)
справочного руководства по UNIX.
Для интерпретатора, как и для многих других команд, особенности выполнения наиболее четко проявляются в ходе эксперимента. В справочном руководстве что-то может оказаться неясным, и здесь на помощь вам придет хороший пример. По этой причине материал главы построен на примерах, которые демонстрируют возможности языка. Мы будем обсуждать не только вопросы программирования с помощью интерпретатора, но и проблемы создания программ на языке shell
, уделяя особое внимание тестированию и диалогу.
Если вы написали программу на языке shell
или каком-то ином языке, она может оказаться полезной и другим пользователям вашей системы. Однако требования, которым, по мнению других, должна удовлетворять программа, обычно оказываются более строгими, чем предъявляемые к ней вами. Поэтому важнейший аспект программирования на языке shell
— обеспечение надежности программы, чтобы она могла выполняться даже при неверно заданных входных данных и выдавать полезную информацию об ошибках.
5.1 Совершенствование команды cal
Типичная задача программирования на языке shell
сводится к изменению взаимодействия между пользователем и программой, чтобы сделать это взаимодействие более удобным. В качестве примера рассмотрим команду cal(1)
:
$ cal
usage: cal [month] year
Пока хорошо
$ cal october
Bad argument
Уже не так хорошо
$ cal 10 1983
October 1983
S M Tu W Th F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
$
Досадно, что месяц нужно задавать числом, и к тому же, как оказалось, команда cal 10
выдает календарь на весь 10-й год, а не на октябрь текущего года. Поэтому всегда следует указывать год, если вы хотите получить календарь на один месяц.
Указанные выше неудобства связаны с тем, что взаимодействие пользователя с программой было реализовано без привлечения команды cal
. Вы можете изменить характер этого взаимодействия, не меняя самой программы. Если поместить команду в ваш собственный каталог bin
, то возможен более удобный способ перевода аргументов в те, которые нужны настоящей команде cal
. Вы можете даже вызывать свою версию команды, и тогда вам меньше придется запоминать.
Читать дальше
Конец ознакомительного отрывка
Купить книгу