Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Сэйдж Рас Весь текст 822.4 Kb

Приемы профессиональной работы в Unix

Предыдущая страница Следующая страница
1 ... 33 34 35 36 37 38 39  40 41 42 43 44 45 46 ... 71
пункт  меню для создания файла проекта.  Команда l выводит список всех
имен файлов проектов, а v просматривает исходные данные, находящиеся в
файле проекта.

2.  n,n

     Такая последовательность  иллюстрирует  проверку на ошибки внутри
программы.  Сначала включается подсчет времени для текущего файла про-
екта,  а затем он включается опять. Timelog распознает это и сообщает,
что вы должны отключить подсчет перед тем, как снова включить его.

3.  s,junk

     Эта последовательность также иллюстрирует проверку ошибок.  Пыта-
емся  выбрать новое имя файла проекта.  Имя файла junk (которого вы не
имеете).  Timelog проверяет,  существует ли файл регистрации времени с
именем junk.  Если нет,  выводится сообщение о том, что вы должны выб-
рать правильное имя файла проекта.

     ПОЯСНЕНИЯ

     В этом командном файле много текста, но замысел не очень сложен.
     Строка 4 инициализирует переменную PROJ нулевым значением. PROJ -
это переменная,  которая содержит имя проекта,  отображаемое в меню. В
начале работы мы должны быть уверены, что эта переменная установлена в
нуль.
     Строки 6-104 - это огромный бесконечный цикл while,  который  вы-
полняет работу всей программы.  Поскольку это бесконечный цикл, мы мо-
жем выйти из него либо оператором break, (вводя обычные символы преры-
вания), либо с помощью команды выхода.
     В строке 8 позиционным параметрам присваивается результат команды
date. Поступая таким образом, мы можем затем легко обращаться к каждо-
му полю без выделения его командой cut - shell выполняет за  нас  син-
таксический  разбор полей.  Мы можем ссылаться на поля даты в виде $1,
$2 и т.д.
     Строки 9-23 выводят на экран главное меню. Верхняя строка обраща-
ется к данным из команды date. $1, $2 и $3 представляют собой день не-
дели,  месяц и число. $4 - это время. Перед тем как команда echo выво-
дит текстовые строки,  эти переменные раскрываются таким образом,  что
они появляются в меню.  Если переменная PROJ равна нулю,  то ничего не
печатается в качестве имени текущего проекта.  Символы \c в конце  ог-
ромного  оператора  echo устанавливают курсор после приглашения в этой
же строке, так что мы готовы принимать вводимые пользователем символы.
     После печати  меню  в  переменную RSP читается ответ в строке 25.
Затем наступает черед огромного оператора case (строки 27-103),  кото-
рый содержит ветку для каждой команды.
     В строке 28 проверяется, не был ли ответ всего лишь возвратом ка-
ретки,  указывающим,  что пользователь хочет выйти.  Если был, то цикл
while завершается посредством команды break  и  программа  заканчивает
работу.
     Иногда возврат каретки - более желательный метод выхода,  чем ко-
манда  exit  интерпретатора shell.  В конечном итоге эта команда shell
приводит к выполнению программ exit и _exit Си -интерфейса. Выполнение
вызова exit в Си иногда приводит к неожиданным побочным эффектам, в то
время как нормальное выполнение текста программы до конца не дает  та-
ких  же  результатов.  Однажды  мы  столкнулись  с такой проблемой при
использовании ESC -последовательностей для изменения цвета на  цветном
мониторе.  Когда программа завершалась нормально, цвет не переустанав-
ливался.  Однако когда был сделан системный вызов exit, печатались не-
которые ESC-последовательности,  что переустанавливало отдельные части
экрана. Очень странно!
     Строки 29-38 управляют функцией выбора проекта.  Имя проекта зап-
рашивается и читается в переменную PROJ2.  PROJ2 использована для вре-
менного хранения этого значения. Если был введен возврат каретки, опе-
ратор continue приводит к следующей итерации внешнего цикла while. Это
позволяет  пользователю прекратить выполнение этой функции при ошибоч-
ном вводе,  оставаясь все же в timelog.  Если ввод был непустым,  файл
проекта  проверяется на существование и на наличие в нем данных.  Если
файл не существует,  пользователя просят указать верное  имя  проекта.
Если  имя файла правильное,  то переменной PROJ присваивается значение
PROJ2. Только после того, как командный файл с уверенностью знает, что
имя,  введенное пользователем,  допустимо,  оно назначается в качестве
текущего имени проекта.  Это предохраняет от  потери  выбора  текущего
проекта из-за ошибки пользователя. Теперь PROJ выводится в меню на эк-
ран.
     Команда создания обрабатывается строками 39-50.  Снова запрашива-
ется имя и проверяется,  не равно ли оно нулю.  Если имя было введено,
то проверяется, существует ли уже такой файл. Мы не хотим снова созда-
вать и затирать уже имеющийся файл. Файл создается в строке 50. В этот
файл выводятся отметка о времени его инициализации и начальное сообще-
ние о том, что подсчет времени отключен.
     Опция вывода списка выполняется в строках 51-53.  Выводится заго-
ловок,  а затем команда ls используется для генерации списка. Если нет
файлов нужного нам типа,  то команда ls возвращает статус, отличный от
нуля,  тем самым включается оператор ||.  В сущности этот фокус  shell
дает  нам встроенный оператор if-then,  который может использовать ре-
зультаты предыдущей команды. Если выполнение команды ls неудачно (т.е.
не  найдены  подходящие файлы),  это сообщение об ошибке отбрасывается
(не выводится) и выполняется оператор echo. Команда echo сообщает, что
нет файлов, чтобы вы знали об этом.
     Всякий выход команды ls пропускается через команду sed  для  отб-
расывания  расширения  имени  файла .time.  Для сохранения места и для
удобства пользователя мы хотим только посмотреть  и  напечатать  имена
проектов,  а не имена файлов.  Однако, мы хотим хранить имена файлов в
специальном внутреннем формате так,  чтобы мы могли проще обрабатывать
их и поддерживать уникальные имена.
     Команда просмотра выполняется в строках 54-60.  Текущий файл про-
екта проверяется на то,  было ли выбрано имя.  Если нет,  главное меню
выводится снова. В противном случае печатается строка из черточек, вы-
водится командой more файл проекта и печатается еще одна строка черто-
чек для обрамления выведенной информации.  Вы можете удивиться, почему
первым  символом оператора echo является двоеточие (:).  Это некоторый
казус, поскольку, если вы попытаетесь отобразить символ черточки (-) в
качестве первого символа,  то оператор echo "подумает", что это пустая
опция и не выведет ее на экран.  Вы просто должны поставить  в  первой
позиции какой-то непустой символ, отличный от черточки.
     Включение подсчета времени выполняется в строках  61-70.  Текущее
имя проекта проверяется на то, было ли оно выбрано. Если да, то прове-
ряется,  был ли отключен файл проекта. Мы выполняем это, используя ко-
манду  tail  для  выделения последней строки файла,  затем передаем по
конвейеру эту строку команде cut,  где мы изменяем  символ-разделитель
на символ : и отрезаем первое поле. Если в этом поле находятся символы
OFF,  все в порядке.  После этого строка 69 выводит на экран сообщение
для пользователя,  а строка 70 вставляет в файл проекта строку ON,  за
которой следует текущая дата.  Тем самым файл отмечается как  включен-
ный.  Подсчет времени начался. Если эта операция уже была включена, мы
сообщаем об этом пользователю и выходим из данной операции меню.
     Строки 71-80 обрабатывают отключение подсчета времени. Здесь поч-
ти все идентично тексту  программы,  который  включает  эту  операцию,
только если там было слово "on", то здесь слово "off".
     Строки 81-101 обрабатывают подчиненное меню выдачи отчетов и ста-
тистики. Как видите, экранное меню спланировано таким же образом: цикл
while, печать меню, чтение ответа, выполнение оператора case в зависи-
мости  от  выбранной  команды и т.д.  Команда r подобна главному меню,
только сокращена для того, чтобы поместиться внутри оператора case. Вы
также можете заметить,  что в строках 96-99 выполняется не очень много
обработки. Это то место, где вы должны выполнить некоторую работу.
     Строка 102  выполняет  обработку ошибок при любом неверном вводе.
Печатается сообщение об ошибке,  оператор case  выходит  на  следующую
итерацию цикла while, и все начинается сначала.

     МОДИФИКАЦИИ

     Основной возможностью для модификации является добавление  факти-
ческой обработки информации о времени. Один из подходов к этому - зап-
росить почасовой тариф времени в момент создания файла  проекта  (если
считать,  что вы работаете на таких основаниях). Этот тариф может хра-
ниться первым пунктом в файле проекта. Следующие две строки могут быть
отведены для "счета по текущему сеансу" и "общего счета" соответствен-
но. Когда подсчет времени работы над проектом отключается, можно проа-
нализировать  текущее системное время и начальное время подсчета и за-
тем пересчитать в минуты (для упрощения арифметики)  с  использованием
команды expr (или,  возможно,  awk). Затем это значение можно умножить
на хранимый в файле тариф времени,  а результат сохранить в  записи  о
текущем сеансе работы и ДОБАВИТЬ к совокупной общей записи.

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

ИМЯ:   today
---------------------------------------------------------------------------

today     Печать календаря с подсвеченной сегодняшней датой

     НАЗНАЧЕНИЕ

     Модифицирует вывод утилиты cal для печати  сегодняшней  даты  ин-
     версным цветом.

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

today

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

today     Печатает календарь на этот месяц с подсвеченной
          сегодняшней датой

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

1   :
2   # @(#) today v1.0  Calendar with today highlighted
Author: Russ Sage
2а                       Календарь с подсветкой сегодняшнего дня

4   SYSV=n

6   set `date`

8   if [ "$SYSV" = "y" ]
9     then RVR=`tput smso`
10         BLNK=`tput blink`
11         NORM=`tput rmso`
12         cal ${2} ${6} | sed "s/${3}/${RVR}${BLNK}${3}${NORM}
/g" -e "s/^/ /"
13    else RVR="^[[7m"   # termcap so
14         NORM="^[[0m"  # termcap se
15         cal ${2} ${6} | sed -e "s/ ${3}/ ${RVR}${3}${NORM}
/" -e "s/^/  /"
16  fi

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

RVR     Управляющий символ инверсного отображения для
        вашего терминала
BLNK    Управляющий символ мерцания для вашего терминала,
        если таковой имеется
NORM    Управляющий символ для возврата терминала в
        обычный режим

       ОПИСАНИЕ

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

     Всегда приятно  иметь инструментальные средства,  предоставляющие
нам информацию  о  нашей  среде.  Тип  информации,  который  мы  здесь
рассматриваем - это модифицированный вывод календаря.  Стандартная ко-
манда cal выводит дни месяца,  но не сообщает вам, какой день сегодня.
Как  мы  это узнаем?  Мы должны запустить команду date для определения
текущего дня.  Довольно тривиальная задача,  однако наше решение может
дать  некоторую  ценную графику,  которая может добавить действительно
полезную информацию к календарю.
     Для выполнения такой модификации нам необходимо выполнить постоб-
работку результата команды cal.  Поскольку не все  терминалы  обладают
одинаковыми  возможностями,  эта программа должна быть приспособлена к
вашей машине.

     ЧТО ДЕЛАЕТ today?

     Today - это постпроцессор для команды cal,  который делает ее ре-
зультат более информативным и графически наглядным. Выполнение модифи-
кации команды cal зависит от того,  в какой системе вы работаете. Если
вы в системе UNIX System V (версия 2 или старше), то у вас есть утили-
та terminfo.  Terminfo является заменой для файла termcap и  поставля-
ется с несколькими утилитами, которые возвращают значения с информаци-
ей о                ПРИЕМЫ ПРОФЕССИОНАЛЬНОЙ РАБОТЫ В UNIX
нальных  характеристик.  Если  ваш  компьютер  работает  не с системой
System V, то вам необходимо немного поисследовать тип ваших конкретных
терминалов и внести полученные значения в вашу программу.
     Вся история с утилитами termcap и terminfo иллюстрирует  эволюцию
Предыдущая страница Следующая страница
1 ... 33 34 35 36 37 38 39  40 41 42 43 44 45 46 ... 71
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (52)

Реклама