ИМЯ:   jargon

НАЗНАЧЕНИЕ

Компьютеризованная версия старого настольного генератора технических терминов.

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


             jargon

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

jargon
125
Если ввести 125 в ответ на запрос, то на выходе получится фраза Total Monitored Concept

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


    1   :

    2   # @(#) jargon v1.0 Technical jargon generator

    Author: Russ Sage

    2а                       Генератор технического жаргона

         

    4   echo "\n\t\tThe Jargon Generator"

    5   while :

    6   do

    7           echo "\nEnter a 3 digit number (000-999), ?

    , or : \c"

    8           read NUM

     

    10          case $NUM in

    11          "") exit;;

    12          \?) cat < /dev/

    null ||

    27                    { echo "\nNot a valid number, try again

    "; continue; };;

    28          *)   echo "\nInvalid input, try again"

    29               continue;;

    30          esac

     

    32          N1=`echo $NUM|cut -c1`

    33          N2=`echo $NUM|cut -c2`

    34          N3=`echo $NUM|cut -c3`

    35          SEN=""

     

    37          case $N1 in

    38          0)  SEN="${SEN}Integrated ";;

    39          1)  SEN="${SEN}Total ";;

    40          2)  SEN="${SEN}Systematized ";;

    41          3)  SEN="${SEN}Parallel ";;

    42          4)  SEN="${SEN}Functional ";;

    43          5)  SEN="${SEN}Responsive ";;

    44          6)  SEN="${SEN}Optional ";;

    45          7)  SEN="${SEN}Synchronized ";;

    46          8)  SEN="${SEN}Compatible ";;

    47          9)  SEN="${SEN}Balanced ";;

    48          esac

     

    50          case $N2 in

    51          0)  SEN="${SEN}Management ";;

    52          1)  SEN="${SEN}Organizational ";;

    53          2)  SEN="${SEN}Monitored ";;

    54          3)  SEN="${SEN}Reciprocal ";;

    55          4)  SEN="${SEN}Digital ";;

    56          5)  SEN="${SEN}Logistical ";;

    57          6)  SEN="${SEN}Transitional ";;

    58          7)  SEN="${SEN}Incremental ";;

    59          8)  SEN="${SEN}Operational ";;

    60          9)  SEN="${SEN}Third-Generation ";;

    61          esac

     

    63          case $N3 in

    64          0)  SEN="${SEN}Options";;

    65          1)  SEN="${SEN}Flexibility";;

    66          2)  SEN="${SEN}Capability";;

    67          3)  SEN="${SEN}Mobility";;

    68          4)  SEN="${SEN}Programming";;

    69          5)  SEN="${SEN}Concept";;

    70          6)  SEN="${SEN}Time-Phase";;

    71          7)  SEN="${SEN}Projection";;

    72          8)  SEN="${SEN}Hardware";;

    73          9)  SEN="${SEN}Contingency";;

    74          esac

     

    76          echo "\n\"$SEN\""

    77  done

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

N1 Первая цифра числа
N2 Вторая цифра числа
N3 Третья цифра числа
NUM Число, введенное пользователем с клавиатуры
SEN Предложение, полученное из найденных слов

ОПИСАНИЕ

Зачем нам нужен jargon?

В нашем скоростном, заполненном техникой мире на нас оказывается большое давление с целью получения каких-то результатов. К сожалению, быстрота современной техники относится к выполнению программ, а не к их созданию. Когда мы сделали всего лишь третью часть программы, а уже пора ее предъявлять на рынок - как мы можем создать впечатление, что наш продукт делает больше, чем на самом деле? Необходимо немного пустить пыль в глаза заказчику. Пускание пыли состоит из фраз, которые выглядят и звучат впечатляюще. При строгой проверке мы можем увидеть, что фраза составлена из настоящих английских слов, значение которых можно посмотреть в словаре. Эта фраза в целом совершенно бессмысленна, но если нам повезет, то читатель этого не заметит!

Одним из простых способов получения таких вещей является наличие таблицы взаимозаменяемых слов, которые можно использовать для составления предложений. Если у вас система BSD, то вы можете запустить jargon вместе с программой fortune, которая имитирует случайные подарки судьбы. Мудрость веков может принадлежать вам!

Что делает jargon?

Jargon - это инструмент для генерации фраз, состоящих из технических терминов. Строится фраза, которая является комбинацией трех слов. Первые два слова являются прилагательными, используемыми для описания третьего слова, имени существительного. Каждое слово выбирается из столбца, содержащего десять возможных слов. Именно это придает программе jargon ее творческие способности. Она может объединять слово из одного столбца с любым словом из другого столбца для построения многих полезных фраз. Если вы хотите увидеть всю таблицу слов, введите символ ?. Вот пример таблицы:


    |

    |                 The Jargon Generator

    |

    |    Enter a 3 digit number (000-999), ?, or : ?

    |

    |    0. Integrated        0. Management       0. Options

    |    1. Total             1. Organizational   1. Flexibility

    |    2. Systematized      2. Monitored        2. Capability

    |    3. Parallel          3. Reciprocal       3. Mobility

    |    4. Functional        4. Digital          4. Programming

    |    5. Responsive        5. Logistical       5. Concept

    |    6. Optional          6. Transitional     6. Time-Phase

    |    7. Synchronized      7. Incremental      7. Projection

    |    8. Compatible        8. Operational      8. Hardware

    |    9. Balanced          9. Third-Generation 9. Contingency

    |

Имеется три возможных варианта ввода. Вы можете ввести трехзначное число, знак вопроса для печати таблицы или возврат каретки для выхода из программы. Проверяется, является ли строка из трех цифр допустимым числом. Если все в порядке, то введенное число разбивается на три составляющие его цифры. Каждая цифра используется как ключ поиска в массиве из десяти слов для получения куска предложения. Затем все слова объединяются для формирования жаргонной фразы. После этого вам выдается запрос на дальнейший ввод.

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

Внутри самой программы выполняется только проверка на ошибки.

Программа jargon организована аналогично программе, управляемой с помощью меню, однако никакого меню нет. Это просто цикл, который выполняется до тех пор, пока не будет нажат возврат каретки.

ПРИМЕРЫ


        1.  $ jargon

         898

Открывается секрет, что у меня персональный компьютер 898, то есть Compatible Third-Generation Hardware (совместимая аппаратура третьего поколения).


         2.  $ jargon

          187

Оказывается это Total Operational Projection (всеобъемлющий разрабатываемый проект).

ПОЯСНЕНИЯ

Строка 4 печатает заголовок при начальном запуске программы.

Отображается возврат каретки, две табуляции и сообщение.

Строки 5-77 представляют собой один большой бесконечный цикл while. В нем имеется всего одна точка выхода, находящаяся внутри оператора case. Строка 7 выводит приглашение, а строка 8 читает вводимый ответ в переменную NUM.

Строки 10-30 являются оператором case, который проверяет информацию, введенную с клавиатуры. Если был введен только возврат каретки, строка 11 рассматривает это как нулевой ввод. В этом случае выполняется выход из программы. Это и есть нормальная точка выхода.

Ввод вопросительного знака соответствует строке 12. Обратите внимание, что знак вопроса экранирован. Это выполнено по той причине, что символ ? имеет для shell специальное значение. Он используется как представитель любого одиночного символа при порождении имени файла.

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

В строках 12-24 команда cat получает текст из последующего фрагмента самой программы. Такого рода файл иногда называют "встроенным документом". Возможность обработки встроенного документа активируется последовательностью символов <<. Слово, которое следует за ней, является признаком начала-окончания, в данном случае EOF. После того, как текст будет выведен на экран, строка 25 продолжает выполнение следующей итерации внешнего цикла while.

Попутно отметим: для того, чтобы увидеть, как shell управляет встроенными документам, посмотрите во время работы командного файла каталог /tmp. В нем находится файл с именем "shXXXX", где XXXX - идентификатор shell, создавшего этот файл. Весь встроенный документ целиком помещается в этот временный файл. Затем shell выполняет переадресацию своего входа на этот временный файл. Довольно простой метод.

Строка 26 соответствует всем случаям ввода, когда имеется три символа. Эти символы могут быть буквами и/или цифрами. В этом месте shell еще не знает, есть ли там буквы. Для проверки того, что все введенные символы являются цифрами, мы должны использовать команду expr, выполняющую дополнительный анализ. Оператор expr указывает, что нужно сравнить строку NUM с последовательностью "начало строки, цифра, цифра, цифра, конец строки". Если сопоставление успешно, expr возвращает статус успешного возврата и программа идет дальше. Поскольку expr возвращает число совпавших символов, этот результат должен быть перенаправлен в каталог /dev/null.

Если сравнение завершилось неудачей, активизируется оператор || (мы уже видели такого рода управляющую структуру ранее), который печатает сообщение об ошибке и вызывает следующую итерацию цикла while. Такой синтаксис представляет собой то же самое, что и оператор if-then-else. Поскольку за символами || может следовать список команд, то внутрь простых разделителей списка {} можно вставить более одной команды. Будьте внимательны. Если отсутствуют символы-разделители, то оператор continue выполнится как после сообщения об ошибке, ТАК И при успешном выполнении команды expr. Это может заставить вас заниматься отладкой, пока вы не обнаружите, что же произошло на самом деле.

Точно такую же проверку числа можно было бы выполнить с помощью оператора case. Синтаксис был бы таким же, за исключением зацепочных символов ^ и $. Шаблон для оператора case выглядел бы так:


          [0-9][0-9][0-9]  statement;;

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

Любой другой ввод перехватывается в строке 28 путем проверки на совпадение с универсальным символом-заменителем *. Выводится сообщение об ошибке, и оператор continue вызывает следующую итерацию цикла while, который запрашивает новый ввод.

Обратите внимание, как shell рассматривает строки. Команда test фактически выполняет сравнение значения строки. Несмотря на то, что команде test(1) посвящена своя страница справочного руководства, она является встроенной функцией shell. Если при вызове команды test использован синтаксис =, !=, то два аргумента рассматриваются как строки. Но если в команде test используется синтаксис вида -lt, -eq, то производится сравнение двух аргументов-строк как чисел и выполняется их числовая обработка. Эти два различных режима нельзя смешивать, т.е. нельзя сравнивать строки при помощи числового оператора, например str1 -eq str2.

В строках 32-34 каждая цифра вырезается из числа и помещается в свою собственную переменную. Затем эти переменные используются в качестве индекса в операторе case, который содержит магические слова.

Строка 35 инициализирует переменную SEN для сбора предложения. (Предварительное замечание перед тем, как мы начнем получать письма от ревнителей чистоты грамматики - да, мы знаем, что то, что мы генерируем, является фразой, а не настоящим предложением, поскольку отсутствует глагол.) Начинаем мы с пустого предложения и добавляем к нему каждый раз по одному слову.

Строки 37-48 представляют собой первый оператор case. Оператор case берет значение переменной N1 и добавляет слово с таким номером к предложению. На самом деле нет необходимости включать значение переменной SEN в правую часть присваивания, поскольку еще ничего нет. Однако это делает текст программы более гибким, если мы решим предварительно сгенерировать первоначальное предложение некоторыми другими средствами. Аналогичные операторы case обрабатывают две следующие цифры.

Полученное предложение выводится в строке 76 после того, как найдены все слова. Вы могли бы сказать, что вся эта штука представляет собой 754 подвиг, или Synchronized Logistical Programming (Синхронизированное логическое программирование).

МОДИФИКАЦИИ

Можно немного поиграться с этой программой. Вы могли бы получать случайное число, зависящее от текущего системного времени (используя извлечение и команду expr) и основывать поиск на этом числе, а не на числе, введенном пользователем. Вы также могли бы использовать каждую цифру случайного числа для управления выбором слова из различных баз с жаргонными терминами, имея, возможно, по одному файлу для каждой из трех позиций слова и организуя цикл на случайное значение для чтения каждого слова. Слова могли бы читаться и удаляться из файла до тех пор, пока не прочитается слово, которое соответствует случайной цифре.

Имеется множество других возможностей. Если вы вовремя не остановитесь, то обнаружите, что вы написали компьютерную игру!



            ИМЯ:  phone

phone База данных с телефонными номерами

НАЗНАЧЕНИЕ

Управляемое меню средство, поддерживающее базу данных с телефонными номерами

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


          phone

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

phone Вызов телефонной базы данных
s Ввод опции поиска
russ Поиск номера телефона Расса

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


    1   :

    2   # @(#) phone v1.0 Maintain telephone database

    Author: Russ Sage

    2а                      Сопровождение телефонной базы данных

     

    4   if [ $# -gt 0 ]

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

    6           echo "usage: phone"          >&2

    7           exit 1

    8   fi

     

    10  BASE="$HOME/.phone.list"

     

    12  while :

    13  do

    14         echo "

     

    16  phonebase = $BASE

     

    18        PHONE MENU

    19        ----------

    20    add name to list

    21    delete name from list

    22    edit list

    23    search for name in list

    24    view complete list

    25     - exit program

     

    27  Press a,d,e,s,v or : \c"

    28  read RSP

     

    30          case $RSP in

    31          "")     exit 0

    32                  ;;

    33          a|A)    echo "\nEnter name to add ( to exit

    ): \c"

    34                  read NAME

    35                  if [ "$NAME" = "" ]

    36                    then continue

    37                  fi

    38                  echo "Enter description of person: \c"

    39                  read DESC

    40                  echo "Enter number to add: \c"

    41                  read NUM

    42                  echo "$NAME\t$DESC\t\t\t$NUM" >> $BASE

    43                  sort -t" " +1 -1.3b -o $BASE $BASE

    44                  ;;

    45          d|D)    echo "\nEnter name to delete ( to exit

    ): \c"

    46                  read NAME

    47                  if [ "$NAME" = "" ]

    48                    then continue

    49                  fi

    50                  sed -e "/$NAME/d" $BASE.new

    51                  mv $BASE.new $BASE

    52                  ;;

    53          e|E)    vi $BASE

    54                  ;;

    55          s|S)    echo "\nEnter name to search: \c"

    56                  read NAME

    57                  echo "\n----------------------------------"

    58                  grep -y "$NAME" $BASE

    59                  echo "------------------------------------"

    60                  ;;

    61          v|V)    echo "\n\tPhone List\n\t---------" &

    62                  more $BASE

    63                  echo "\nhit \c"

    64                  read RSP

    65                  ;;

    66          *)      echo "Not a valid command"

    67                  ;;

    68          esac

    69  done

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

BASE Фактическое имя файла телефонной базы данных
DESC Описание, вводимое в базу данных
NAME Имя, вводимое в базу данных
NUM Номер телефона, вводимый в базу данных
RSP Ответ пользователя на приглашение

ОПИСАНИЕ

Зачем нам нужен phone?

Телефоны представляют собой очень важную часть нашего рабочего дня. Мы используем их для сообщения своих планов, отдачи распоряжений и для многих других целей. Немного поразмышляем. Если почти на каждом рабочем месте в США установлен телефон, то телефонных номеров миллионы. Каким образом вы храните все ваши телефонные номера?

Нам необходима очередная база данных. Эта база данных должна управлять вводом данных, их извлечением, модификацией и удалением. У нас теперь есть опыт в реализации программ, управляемых с помощью меню, поэтому имеет смысл использовать меню и здесь.

Что делает phone?

Phone - это универсальная утилита для использования и управления базой данных телефонных номеров. Полностью управляемая при помощи меню, phone содержит все необходимые функции, связанные с управлением базой данных: добавление, удаление, просмотр, редактирование и поиск.

Файл, представляющий собой базу данных, размещен в вашем регистрационном каталоге. Это файл $HOME/.phone.list. Phone использует ваш регистрационный каталог, так что один и тот же исполняемый модуль работает для любого пользователя. Независимо от того, где размещается командный файл phone или кто и откуда его запустил в вашей системе, вы всегда получите именно ваш файл телефонных номеров, поскольку он подключен к вашему регистрационному каталогу посредством встроенной переменной shell с именем HOME.

Имеется всего одно главное меню. Оно выводится на экран, и внизу появляется приглашение. Большинство вариантов выбора запрашивают дополнительную информацию. Меню выглядит так:


    |

    |

    |  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 в какое-то другое место, мы смогли по окончании обработки вернуться туда, где мы начали работать. Затем по команде cd мы переходим в каталог /usr/news. Это каталог, в котором хранятся файлы новостей. В системе Berkeley доступен каталог /usr/msgs. Этот каталог очень похож на /usr/news и может использоваться вместо него, если у вас есть такое желание. Выводится в виде столбцов список файлов из каталога /usr/news (строка 49), и вам задается вопрос о том, хотите ли вы посмотреть какие-нибудь из этих файлов. Если вы вводите возврат каретки, команда test воспринимает это как нулевой ввод и выполняется выход из оператора while.

Цикл while выполняется до тех пор, пока значение переменной NAME не равно нулю (строка 52). Введенное имя проверяется на существование. Если такой файл существует, то он распечатывается командой cat, обрамленной строками из черточек. Если файл не существует, то выводится сообщение о том, что такого файла новостей нет. Затем вас просят ввести имя другого файла. Этот процесс продолжается в цикле, пока вы не введете только возврат каретки. Когда вы выходите из цикла в строке 62, выполняется команда cd для возврата в тот каталог, откуда вы начали работать. Эта команда cd не оказывает никакого влияния после запуска утилиты office. Вы должны указать команду cd вашему регистрационному shell. Никакая другая программа, запущенная из порожденного shell, не может выполнить для вас команду cd.

Строки 64-77 выполняют функции календаря. Сначала выводятся две пустые строки. Почему две? Потому что обычно команда echo вставляет символ новой строки в конце каждой выводимой строки, а выводимой в данный момент строкой является еще один символ новой строки. Затем в строке 65 запускается программа today. Она печатает изображение календаря на месяц. Строка 66 проверяет, имеется ли календарный файл в вашем регистрационном каталоге. Если да, он выводится в длинном формате команды ls в строке 67. Печатается также сообщение-заголовок "Calendar Notifications" (календарные извещения).

Строка 69 запоминает текущий рабочий каталог переменной PWD. Затем мы переходим командой cd в каталог $HOME, чтобы находиться в том же каталоге, что и календарный файл. В строке 71 вызывается команда UNIX calendar. Она просматривает календарный файл и выводит все подходящие по времени сообщения. По команде cd мы возвращаемся в наш исходный каталог для того, чтобы восстановить порядок. Строка 73 выводит сообщение, чтобы вы проверили вашу почту на наличие календарных записей. Как указывалось ранее, команда calendar работает двумя способами.

Оператор else в строке 74 выводит вам сообщение, если у вас нет календарного файла. По завершении оператора if, в строках 76 и 77 печатается сообщение о том, что нужно нажать возврат каретки, и выполняется оператор read. Это блокирующее чтение, которое означает остановку и ожидание какого-либо ввода. Это противоположность неблокирующему чтению, или более широко известной технике чтения с опросом. Опрос возможен в программах, написанных на Си, но запуск опроса в shell может потребовать немного больших усилий. Для изучения чтения с опросом ознакомьтесь с главой, описывающей терминальные устройства.

Строка 78 управляет командой phone. Она вызывает утилиту phone, которую мы рассмотрели ранее, после чего управление передается в конец цикла while. Печатается главное меню, и все начинается сначала. Строки 79-97 управляют автоматическими напоминаниями. Сначала запускается программа greet. Она была описана ранее в этой главе. Затем в строках 80 и 81 в режиме фонового выполнения вызываются два командных файла at, которые выполнятся позже в течение дня. В строке 84 вам задается вопрос, желаете ли вы оставить какие-то свои напоминания. Если вы отвечаете "y", выполняются строки 87-96. Если вы не ввели "y", оператор else не выполняется, поэтому управление передается главному меню. Вы видите, что эта возможность предполагает однократное использование в течение дня.

Строки 87-89 выводят некоторую информацию, необходимую для того, чтобы вы завели для себя напоминания. Выводится синтаксис программы at, текущая дата (только время) и затем приглашение вводить вашу команду. Строка 90 читает вашу команду. Строка 91 означает, что если был введен не только возврат каретки, то нужно выполнить этот цикл. Поэтому цикл while продолжается, пока вы не нажмете только возврат каретки. Строка 93 пытается выполнить команду, которую вы ввели. Команда eval используется для того, чтобы раскрыть значения тех переменных, которые могли быть не раскрыты ранее. Строка 94 просит ввести следующую команду, а строка 95 читает ее. Поскольку чтение стоит в самом конце цикла, оператор while выполняет проверку нового ввода с клавиатуры.

Строки 98-102 управляют выходом в shell. Эта часть программы почти идентична циклу, использованному для напоминаний. Нам выдается приглашение на ввод команды, она зачитывается в переменную, затем делается синтаксический разбор этой переменной с помощью команды eval.

Если вы хотите перейти в shell, выполните команду sh - и она породит shell. Строки 101 и 102 не дают появиться на экране главному меню до тех пор, пока вы не нажмете возврат каретки.

Строки 103-105 выполняют проверку на ошибки ввода. Любая неправильная команда попадает сюда. Выводится сообщение об ошибке и выдается приглашение "hit " (нажмите возврат каретки).

Назад | Содержание | Вперед