Рассел Сейдж. Приемы профессиональной работы в unix перевод "Tricks of the unix masters" by Russel G

Вид материалаДокументы

Содержание


Формат вызова
Переменные среды выполнения
Подобный материал:
1   ...   20   21   22   23   24   25   26   27   ...   45

появляется приглашение. Большинство вариантов выбора запрашивают до-

полнительную информацию. Меню выглядит так:


------------------------------------------------------------------------


|

|

| phonebase = /usr/russ/.phone.list

|

| PHONE MENU

| ----------

| add name to list (добавить имя к списку)

| delete name from list (удалить имя из списка)

| edit list (редактировать список)

| search for name in list (поиск имени в списке)

| view complete list (просмотр списка)

| - exit program (выход из программы)

|

| Press a,d,e,s,v or :

|


В верхней строке меню выводится имя телефонной базы данных, кото-

рую вы используете. Если это не ваш файл, вы точно знаете, что прои-

зошла ошибка. Опции выбираются нажатием клавиши, соответствующей пер-

вой букве слова. Если был нажат только возврат каретки, программа за-

вершается.


ПРИМЕРЫ


1. $ phone

a

russ sage

unix master

123-4567


Такая последовательность действий используется для добавления еще

одного номера в базу данных. Вызывайте меню, выбирайте опцию добавле-

ния и в ответ на запросы утилиты phone вводите имя, описание и номер

телефона.


2. $ phone

V


Просмотр всех записей в вашей базе данных.


ПОЯСНЕНИЯ


Строки 4-8 выполняют некоторую проверку на наличие ошибок. Если

вы вызвали phone с какими-либо аргументами, выводится сообщение об

ошибке и программа завершается. Поскольку phone управляется при помощи

меню, она не использует аргументы.

Строка 10 инициализирует переменную BASE именем файла телефонной

базы данных. Это назначение выполняется с помощью переменной HOME для

получения вашего регистрационного каталога.

Строки 12-69 представляют собой один большой бесконечный цикл

while. Вся эта структура подобна структуре других программ, управляе-

мых с помощью меню, которые мы рассмотрели. Само меню выводится опера-

тором echo. Текст меню НЕ выделен отступами подобно остальной части

программы, поскольку оператор echo воспринимает этот текст как лите-

ральные данные, включая пробелы.

Строка 28 читает ответ пользователя, а строки 30-68 представляют

собой оператор case, который проверяет значение ответа. Если был нуле-

вой ввод, программа завершается.

Если была введена буква a, выбирается опция добавления. (В

действительности каждая опция проверяется и на верхнем, и на нижнем

регистре для обеспечения гибкости). Текст программы, соответствующий

добавлению, запрашивает имя, описание и номер телефона. Если вы оказа-

лись в опции добавления случайно, используйте возможность возврата пу-

тем нажатия возврата каретки в ответ на запрос имени. Однако после то-

го, как вы ввели имя, выйти уже нельзя. Вам необходимо в этом случае

поместить в базу фиктивную запись или нажать клавишу аварийного завер-

шения для выхода из программы вообще. Описание может быть произвольной

длины, однако оно не смотрится, если очень длинное. После того как все

поля введены, вся строка помещается в конец базы данных. Отметим, что

добавляются символы табуляции для разбиения записи на поля. После это-

го база данных пересортировывается, чтобы новая запись заняла свое

место в алфавитном порядке.

Если была введена буква d, то она распознается в строке 45. Зап-

рашивается удаляемое имя. Если вводится только возврат каретки, опера-

тор continue возвращает нас обратно в цикл while и снова выводится

главное меню. Для удаления записи использована команда sed, поэтому

вводимое имя должно указываться точно в таком же виде, как оно хра-

нится в файле. Результат удаления помещается во временный файл, кото-

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

Одной из модификаций может быть показ пользователю того, что он соби-

рается удалять, и запрос подтверждения. Если подтверждение получено,

то данные удаляются окончательно. Сейчас сделано так, что вы на самом

деле не знаете, что именно собираетесь удалять. Поэтому необходимо

точно указывать удаляемое имя. Здесь выбран относительно быстрый и не

совсем честный подход. А вообще вы даже могли бы использовать не-

посредственно редактор vi для поиска и удаления.

Опция редактирования в строке 53 выполняет только одно - вызывает

редактор vi для работы с базой телефонных номеров. Используя редактор

vi, вы можете вручную сделать файл базы данных таким, как вам нужно.

Зачастую формат входных данных "плывет" из-за разной длины. Все данные

хранятся в свободном формате и поэтому их можно как угодно смещать

вдоль строки.

Когда вы редактируете ваш файл редактором vi, все его команды ак-

тивны. Действует даже выход в shell и выполнение обычных действий с

системой. Поэтому не забудьте прекратить работу этого shell'а, иначе

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

Для выхода из редактора и возврата к утилите phone используйте обычные

методы, такие как ZZ, :x и :wq.

Опция поиска в строке 55 запрашивает имя, которое нужно искать,

читает это имя, выводит декоративные элементы до и после данных и

использует утилиту grep для нахождения требуемой записи. Утилита grep

в строке 58 использует команду -y, вызывающую нечувствительность к ре-

гистру. Это означает, что вы можете производить ввод искомого элемента

как на верхнем, так и на нижнем регистре. Если не найдено ничего, то

ничего и не выводится на экран.

Опция просмотра начинается со строки 61. Сначала выводится заго-

ловок в фоновом режиме. Это делается для быстроты. На самом деле это

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

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

так. Файл выводится командой more. Пока утилита more постранично выво-

дит файл, все ее команды нам доступны. (Наш командный файл m в главе 4

иллюстрирует, что мы можем делать с помощью more.)

В строке 63 выводится сообщение пользователю о том, что он должен

нажать возврат каретки. Строка 64 выполняет чтение. Эта последователь-

ность придерживает распечатанный файл данных на экране, чтобы его

строки не пропали при сдвиге вверх. Если бы этих операторов не было,

напечаталось бы главное меню и мы потеряли бы то, что находилось в

верхней части экрана.

Строка 66 выполняет проверку на ошибки для меню в целом. Если вы

ввели данные, которые не соответствуют ни одному из предыдущих шабло-

нов, то им сопоставляется шаблон *. В этом случае печатается сообщение

об ошибке, управление переходит из оператора case в конец цикла while

и при следующей итерации этого цикла снова печатается главное меню.


------------------------------------------------------------------------


ИМЯ: office

------------------------------------------------------------------------


office Делопроизводитель


НАЗНАЧЕНИЕ


Обеспечивает простой доступ ко многим утилитам управления делоп-

роизводством, которые мы уже рассмотрели.


ФОРМАТ ВЫЗОВА


office


ПРИМЕР ВЫЗОВА


office Проверяет мой почтовый ящик и сообщает, пуст ли он

m


ТЕКСТ ПРОГРАММЫ office


1 :

2 # @(#) office v1.0 Office Manager Author: Russ Sage

2а Делопроизводитель


4 if [ $# -gt 0 ]

5 then echo "office: argument error" >&2

6 echo "usage: office" >&2

7 exit 1

8 fi


10 while :

11 do

12 c

13 set `date`

14 echo "

15 $1, $2 $3 $4


17 Office Menu

18 -----------

19 Mail

20 News

21 Calendar

22 Phone

23 Automatic Reminders

24 Shell Command

25 to exit


27 press m,n,c,p,a,s or : \c"


29 read CMD


31 case $CMD in

32 "") exit;;

33 m|M) if [ -s /usr/spool/mail/$LOGNAME ]

34 then echo

35 ll /usr/spool/mail/$LOGNAME

36 echo "\nWould yuo like to see it (

y/n): \c"

37 read CMD

38 if [ "$CMD" = "y" ]

39 then echo

40 mail

41 fi

42 else echo "\nNo mail today"

43 fi

44 echo "\nhit \c"

45 read CMD;;

46 n|N) PWD=`pwd`

47 cd /usr/news

48 echo "\nThe following files are news item

in /usr/news:\n"

49 lc

50 echo "\nEnter filename or to exit: \c"

51 read NAME

52 while [ "$NAME" != "" ]

53 do

54 if [ -s $NAME ]

55 then echo "\n-------------------"

56 cat $NAME

57 echo "---------------------"

58 else echo "$NAME is not a news

file"

59 fi

60 echo "\nEnter filename or to

exit: \c"

61 read NAME

62 done

63 cd $PWD;;

64 c|C) echo "\n"

65 today

66 if [ -s $HOME/calendar ]

67 then echo "Calendar file:\n`ll $HOME/

calendar`"

68 echo "\nCalendar notifications:"

69 PWD=`pwd`

70 cd $HOME

71 calendar

72 cd $PWD

73 echo "\nCheck your mail for calendar

notifications"

74 else echo "\nYou do not have a calendar

file at $HOME"

75 fi

76 echo "\nhit \c"

77 read CMD;;

78 p|P) phone;;

79 a|A) greet

80 $HB/at 11:45 echo GLunch in 15 minutes

81 $HB/at 16:45 echo GShift change in 15

minutes


83 echo "\nYou will receive notices at 11:45

& 4:45"

84 echo "\nWould you like to leave some

reminders (y/n): \c"

85 read CMD

86 if [ "$CMD" = "y" ]

87 then echo "\nThe syntax is: at HR:MN

executable_phrase"

88 echo "The time now : `date '+%T'`"

89 echo "\n\ncmd ( to exit): \c"

90 read CMD

91 while [ "$CMD" != "" ]

92 do

93 eval $CMD

94 echo "cmd ( to exit

): \c"

95 read CMD

96 done

97 fi;;

98 s|S) echo "\nenter command: \c"

99 read CMD

100 eval $CMD

101 echo "\nhit \c"

102 read CMD;;

103 *) echo "\nInvalid command"

104 echo "\nhit \c"

105 read CMD;;

106 esac

107 done


ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ


CMD Содержит различные команды на разных уровнях меню

HOME Еще одна экспортируемая переменная, взятая из

среды выполнения

LOGNAME Shell-переменная, предварительно экспортированная

NAME Содержит имя файла с новостями


ОПИСАНИЕ


ЗАЧЕМ НАМ НУЖЕН office?


Многие инструментальные средства в системе UNIX могут выполнять

полезные функции, относящиеся к делопроизводству. В силу способа орга-

низации UNIX, это отдельные и самостоятельные средства. Для того чтобы

узнать о них, необходимо найти все эти средства в справочных руко-

водствах, изучить каждое из них и все время помнить, как с ними рабо-

тать. Это очень неудобно.

Кроме, того, нам необходимо добавить ряд мощных команд к нашему

UNIX, включая несколько отдельных управляемых с помощью меню утилит.

Каким образом мы можем все это об'единить?

Нам необходим механизм, с помощью которого мы можем получить

доступ ко всем функциям, имеющим отношение к делопроизводству. Если

использовать меню, мы сможем вызывать каждую функцию нажатием одной

клавиши.


ЧТО ДЕЛАЕТ office?


Office представляет собой попытку собрать наиболее часто исполь-

зуемые функции делопроизводства в один пакет, управляемый с помощью

меню. Тем самым office упрощает вызов этих функций, поскольку вам не

обязательно знать, где эти утилиты размещаются и как к ним обращаться.

Если у вас есть помощник-секретарь без всякого опыта работы в системе

UNIX, вы можете поручить ему выполнение многих из этих функций. Вы мо-

жете добавить новые функции и уровни меню, если это необходимо.

В office имеются как неотъемлемые общие функции делопроизводства,

так и специфические добавки. Данная утилита пытается управлять как

основными функциями, так и кругом задач по вашему вкусу. К базовым

функциям относятся почта, новости, календарь и база телефонных номе-

ров. Добавляемые особенности включают в себя систему напоминаний,

основанную на утилите at, и возможность запуска еще одного командного

интерпретатора shell, не выходя из программы office. Благодаря всем

этим качествам, все находится в одном месте и обеспечивается простота

доступа и сопровождения.

Главное меню содержит все доступные функции. Оно выглядит так:


------------------------------------------------------------------------


|

| Fri, Jun 20 16:18:23

|

| Office Menu

| -----------

| Mail (Почта)

| News (Новости)

| Calendar (Календарь)

| Phone (Телефоны)

| Automatic Reminders (Автоматические напоминания)

| Shell Command (Переход в shell)

| to exit (Выход)

|

| press m,n,c,p,a,s or :

|


День и дата в левом верхнем углу получены командой UNIX date.

Каждый раз при выводе меню печатается новое значение времени. Оно

сообщает вам о том, когда вы начали работать с этим меню, и как долго

вы работали.

Первым вариантом выбора является почта. Здесь ваш почтовый файл

проверяется на ненулевой размер. Если размер нулевой (или такой файл

отсутствует), выводится сообщение "no mail today" (сегодня почты нет).

Если для вас есть почта, то информация из файла почтового ящика распе-

чатывается в длинном формате командой ls и выводится запрос о том, хо-

тите ли вы прочитать вашу почту. Если вы сказали "yes" (да), выполня-

ется обычная команда UNIX mail.

Вторым вариантом выбора являются новости. Файлы новостей хранятся

в одном каталоге, где каждая порция новостей представляет собой неза-

висимый файл. Все порции новостей хранятся в специальном каталоге с

именем /usr/news. Office выводит список всех файлов новостей и затем

спрашивает, хотите ли вы просмотреть один из них. Если да, введите имя

файла - и он распечатается командой more. Мы предполагаем, что у вас

есть сетевая связь между пользователями или какое-то другое средство

для получения новостей.

Третий вариант выбора - календарь. Поскольку с календарем связана

разнообразная информация, данная опция подразделяется на различные

функции. Сначала выводится полностью календарь на текущий месяц с вы-

деленной сегодняшней датой. Это делается с помощью утилиты today,

рассмотренной ранее. Затем выполняется обращение к системной утилите

работы с календарем. Если в вашем регистрационном каталоге есть файл с

именем calendar, то утилита calendar (выполняемая командой cron для

просмотра каждого регистрационного каталога) просматривает записи ва-

шего календаря. Если какие-либо записи относятся к сегодняшнему или

завтрашнему дню, эта утилита посылает их вам по почте.

Командный файл office использует несколько иной подход. Сначала

ваш файл календаря проверяется на существование и ненулевой размер.

Если файл существует, то он выводится на экран в длинном формате, так

что вы можете увидеть сам файл и информацию, относящуюся к нему. После

этого выполняется функция calendar. При таком вызове на стандартное

устройство вывода печатаются все записи, подходящие по времени. Утили-

та calendar, вызываемая командой cron, обеспечивает связь только при

помощи почты. Если календарного файла нет, то выводится сообщение, ин-

формирующее об этом.

Следующим вариантом выбора являются телефоны. Для управления ба-

зой данных телефонных номеров используется утилита phone, рассмотрен-

ная в предыдущем разделе. Поскольку при вызове phone не выполняется

никакой предварительной или последующей обработки данных, вы можете

перечитать этот раздел, чтобы вспомнить, как работает эта утилита.

Пятый вариант выбора - автоматические напоминания. Эта опция

предназначена для того, чтобы помогать вам в слежении за важными мо-

ментами времени в течение дня. Первым делом она приветствует вас в ду-

хе утилиты greet. Затем запускаются в фоновом режиме два командных

файла at. Они срабатывают в 11:45 для объявления о ленче и в 16:45 для

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

ваших собственных командных файлов в фоновом режиме выполнения, от-

ветьте "yes" (да) на следующий вопрос. Для напоминания выводится син-

таксис утитлиты at, печатается текущее время, и ожидается ваш ввод ко-

манд для at. Красиво и просто в применении! (Если в вашей системе име-

ется встроенная возможность at, а вы реализовали нашу версию at под

другим именем или в другом каталоге, проследите за соответствующими

изменениями в тексте командного файла.)

Благодаря способу выполнения введенной вами команды at, вы можете

ввести любую команду, но не саму at. Цикл сделан так, что он принимает

столько команд, сколько вам нужно. Для выхода из цикла введите возврат

каретки.

Последняя опция предназначена для выполнения любой желаемой ко-

манды вне программы office, оставаясь тем не менее в office. Вы даже

можете бы запустить еще один shell вне программы office (введя с кла-

виатуры sh), а затем по control-D вернуться в office. Нет почти ничего

невозможного.

Для выхода из office достаточно просто нажать возврат каретки.

Тем самым произойдет выход из бесконечного цикла и возврат к предыду-

щему shell.


ПРИМЕРЫ


$ office

s

sh

$


Запуск office и выбор работы с shell. Затем запуск shell-команды

с именем sh, т.е. самого shell. При этом вы запускаете новый shell и

получаете его символ приглашения. По окончании работы с этим shell

введите d для выхода из него и возврата к главному меню утилиты

office.


ПОЯСНЕНИЯ


Строки 4-8 выполняют проверку на ошибки. Если вы вызвали office с

какими-либо опциями, то вы создали ситуацию ошибки.

Строки 10-107 - это один большой цикл while. Его структура подоб-

на ранее рассмотренным утилитам, управляемым с помощью меню. Строка 12

очищает экран командой c (см. главу 7). Если вы не хотите читать с за-

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

пустить эту строку или, если у вас система BSD, использовать команду

clear. В строке 13 позиционным параметрам присваивается результат ко-

манды date.

Строки 14-27 выводят само меню, а строка 29 читает вводимую поль-

зователем команду. Строки 31-106 представляют собой оператор case, ко-

торый распознает введенную команду и выполняет соответствующие

действия.

Строка 32 выполняет выход из программы office, если был введен

только возврат каретки. Строки 33-45 управляют командой mail. Вначале

с помощью команды test проверяется, имеет ли файл с почтовыми сообще-

ниями размер больше нуля. Если да, выводится пустая строка и почтовый

файл печатается в длинном формате команды ls. Затем вам задается воп-

рос о том, хотите ли вы просмотреть почту. Еслы вы вводите "y", вызы-

вается команда mail. При любом другом вводе выполняется возврат в

главное меню.

Строки 46-63 обрабатывают команду новостей. Сначала переменная

PWD устанавливается на наш текущий рабочий каталог. Это делается для

того, чтобы при переходе командой cd в какое-то другое место, мы смог-

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