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

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


    Прохождения игр    
Demon's Souls |#4| Adjudicator & Tower Knight
Demon's Souls |#3| Cave & Armor Spider
Demon's Souls |#2| First Boss
SCP-077: Rot skull

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


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

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

Предыдущая страница Следующая страница
1 ... 31 32 33 34 35 36 37  38 39 40 41 42 43 44 ... 71

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

     ПОЯСНЕНИЯ

     Вся программа  представляет  собой  один  большой   оператор   if
-then-else в строках 4-9. Логика программы выглядит на псевдокоде сле-
дующим образом:

if it is morning                    если утро
  then echo morning statement       то вывести "утреннее"
                                                приветствие
else if it is noon                  иначе если день
  then echo noon statement          то вывести "дневное"
                                                приветствие
else echo evening statement         иначе вывести "вечернее"
                                                приветствие

     В действительности программа гораздо сложнее,  поэтому  переведем
дыхание и приступим к делу.
     В строке 4 проверяется текущее время на  то,  меньше  ли  оно  12
часов.  Если  да,  то  фраза  команды expr выводит на стандартное уст-
ройство вывода единицу ("1").  Поскольку символы ударения (`), которые
обрамляют эту фразу,  перехватывают стандартный вывод, символ 1 стано-
вится частью оператора  проверки,  что  указано  квадратными  скобками
([]). Затем оператор test проверяет, равен ли выход команды expr лите-
ральной единице.  Если они одинаковы,  то в строке 5 выводится "утрен-
нее" сообщение.
     Рассмотрим более  подробно,  как  раскрывается   оператор   expr.
Во-первых, он заключен в символы ударения. Это означает, что он выпол-
няется перед оператором проверки. Затем его выход помещается для обра-
ботки  в оператор test.  Однако внутри оператора expr имеется еще одно
выражение между знаками ударения,  которое  выполняется  до  оператора
expr.  Такое  старшинство  выполнения управляется интерпретатором кода
внутри shell.
     Внутренние знаки  ударения  сохраняются  при  начальном синтакси-
ческом разборе строки,  поскольку они экранированы символами  обратной
косой черты. Первой запускается команда date, имеющая в качестве выхо-
да только текущее значение часа в соответствии с  форматом  %H.  Затем
expr  использует данное значение часа для проверки,  меньше ли оно 12.
Если да,  expr печатает единицу.  Если значение часа больше или  равно
12,  то возвращаемое значение равно 0. Такое понимание, что 1=истина и
0=ложь, соответствует синтаксису, используемому в языке Си.
     Однако ранее  мы замечали,  что в среде программирования на языке
shell 1 означает ложь, а 0 - истину. Это происходит потому, что прове-
ряемое  значение оператора if является в действительности статусом вы-
хода из предварительно выполненной команды.  Нуль  соответствует  нор-
мальному завершению, поэтому 0 использован для переключения проверки в
состояние "истина" и выполнения оператора then. Для того, чтобы преоб-
разовать возвращаемый статус 1 (при условии,  что значение часа меньше
12) в нуль (для переключения оператора then),  мы  используем  команду
test.  Возвращаемый статус единицы равен константе 1,  поэтому команда
test возвращает 0, что представляет истину. Вот так!
     Если бы   не  были  использованы  вложенные  знаки  ударения,  то
единственным способом передачи данного типа  информации  другому  про-
цессу было бы применение переменных shell. Использование вложенной ко-
мандной подстановки дает нам большую гибкость и простоту  программиро-
вания. Чем больше глубина вложенности, тем глубже экранирование знаков
ударения.  Порядок экранирования символами обратной косой черты такой:
не нужно для внешней команды,  один раз для второй внутренней команды,
пять раз для третьей внутренней команды. На четвертом уровне их должно
быть семь или девять (я еще не пробовал), но вероятно нет большой нуж-
ды во вложенности такой глубины.
     Если проверка в строке 4 дает "ложь",  выполняется строка 6.  Это
оператор else от первого if и одновременно следующий if.  В таких осо-
бых случаях синтаксис shell меняется. Ключевое слово "else" становится
ключевым словом "elif".
     Второй if  использует  команду  test точно так же,  как и первый.
Проверяемое время здесь 18,  что представляет собой  6  часов  вечера.
Если вторая проверка также дает "ложь", выполняется последний оператор
в строке 8.  Этот else не использует команду test, поскольку после вы-
полнения  первых  двух  проверок  мы можем сделать вывод,  что остался
последний период времени, а именно период после 18:00.

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

     ИМЯ:    lastlog
---------------------------------------------------------------------------

lastlog        Сообщает время последней регистрации

     НАЗНАЧЕНИЕ

     Записывает и  выводит  на  экран день и время вашей последней ре-
гистрации в системе.

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

lastlog [-l]

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

lastlog Печатает дату, когда вы последний раз регистрировались

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

1   :
2   # @(#) lastlog v1.0 Report last login time Author: Russ Sage
2а                        Сообщает время последней регистрации

4   if [ $# -gt 1 ]
5     then echo "lastlog: arg error"  >&2
6          echo "usage: lastlog [-l]" >&2
7          exit 1
8   fi

10  if [ "$#" -eq "1" ]
11    then if [ "$1" = "-l" ]
12           then date >> $HOME/.lastlog
13                lastlog
14           else echo "lastlog: unrecognized option $1" >&2
15                echo "usage: lastlog [-l]"             >&2
16                exit 1
17         fi
18    else echo "Time of last login : `tail -2 $HOME/.lastlog |
19         (read FIRST; echo $FIRST)`"
20  fi

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

FIRST     Хранит первую из двух введенных строк
HOME      Хранит имя вашего регистрационного каталога

       ОПИСАНИЕ

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

     Одним из преимуществ работы в системе UNIX является то, что в ней
совершается автоматическая запись вашего начального времени при каждом
сеансе работы - вашего времени регистрации.  Эта информация может быть
полезной по нескольким причинам.  Вопервых, вы можете запомнить, когда
вы действительно работали в системе последний раз и проверять,  не ре-
гистрировался   ли  кто-нибудь  под  вашим  паролем  во  время  вашего
отсутствия.  Как мы увидим в главе 9, имеется ряд возможностей для то-
го, чтобы кто-нибудь мог "заимствовать" ваш пароль без спроса. По этой
причине многие коммерческие системы сообщают вам, когда вы регистриро-
вались последний раз (или когда, по их мнению, вы это делали).
     Другой возможной причиной мог бы быть подсчет  общего  времени  в
конце сеанса работы. Вы могли бы использовать это как учетную информа-
цию для себя или вычислительного центра.  Немного позже мы  представим
средство, которое помогает при таких подсчетах.
     Разрабатываемое нами инструментальное средство должно иметь  воз-
можность  записывать  новые значения времени и выводить на экран время
нашей последней регистрации.  Важно,  что данная программа может  быть
вызвана так,  что она не изменяет файл с данными, но постоянно выводит
время последней регистрации.

     ЧТО ДЕЛАЕТ lastlog?

     Lastlog - это программа, которая записывает время вашей регистра-
ции при каждом входе в систему.  Затем это время хранится в файле дан-
ных в вашем регистрационном каталоге под  именем  $HOME/.lastlog.  Имя
файла lastlog начинается с точки с той целью,  чтобы сделать его неви-
димым для команды ls.  Укрытие "служебных"  файлов  от  распечатки  по
умолчанию  несколько предохраняет от любопытных глаз,  а также убирает
эти файлы с дороги, когда вы просматриваете что-то другое.
     При вызове  без опций lastlog печатает для нас дату последней ре-
гистрации, получая запись из файла .lastlog.
     Для выполнения  новой  записи  в файл .lastlog необходимо вызвать
lastlog с опцией -l.  При этом новое значение времени запишется в файл
.lastlog,  а  затем командный файл lastlog вызовет сам себя для вывода
на экран нового значения - небольшая рекурсия.
     Для того,  чтобы  программа  lastlog  работала автоматически,  вы
должны выполнять ее из вашего файла .profile во время регистрации. При
таком способе она запишет последнее время в файл .lastlog.  В качестве
примера посмотрите файл .profile в первой главе.

     ПОЯСНЕНИЯ

     В строках  4-8  выполняется  проверка на наличие ошибок.  Если вы
вызвали lastlog с числом аргументов больше одного,  то это приведет  к
ошибке. Выводится сообщение на стандартное устройство регистрации оши-
бок, и lastlog завершается со статусом ошибки 1.
     Строки 10-20  представляют  собой оператор if-then-else,  который
показывает,  был ли это вызов для записи нового значения  времени  или
для печати старых значений.
     Если в строке 10 число позиционных параметров равно одному, то мы
знаем,  что либо этот параметр должен быть опцией -l, либо это ошибка.
Следующий оператор if в строке 11 проверяет,  является ли первый пози-
ционный параметр опцией -l. Если да, то в файл $HOME/.lastlog добавля-
ется текущая дата и lastlog вызывается снова без аргументов для печати
предыдущей даты регистрации. (Мы только что видели, как это делается.)
Если это не был аргумент -l, то строки 14-16 выполняют обработку ошиб-
ки.
     Если число позиционных параметров равно нулю,  выполняется опера-
тор  else в строке 18.  Отсутствие опций означает,  что мы хотим найти
время нашей последней регистрации на машине и распечатать его. Это ка-
жется довольно простым, но кто сказал, что машины просты?
     Если вы помните последовательность работы, то мы сперва регистри-
руем новое время, а затем хотим найти время нашей предыдущей регистра-
ции. Для файла .lastlog это означает, что наше текущее время регистра-
ции находится в самом конце файла, а наше предыдущее время регистрации
находится в строке непосредственно перед ним. Это значит, что мы долж-
ны получить вторую строку от конца файла. Да уж.
     Как видно из строки 18,  она занимается получением последних двух
строк.  Команда  tail  красиво  выполняет эту работу.  Нам нужен такой
способ,  чтобы мы могли прочитать именно первую строку,  а вторую отб-
росить,  что  выполняется в строке 19.  Мы передаем по конвейеру выход
команды tail подчиненному shell (указанному круглыми скобками),  кото-
рый  читает  первую  строку и затем отображает ее.  А что же со второй
строкой?  Она никогда не берется и пропадает.  Другим  способом  может
быть передача выхода команды tail по конвейеру команде "head -1".
     Поскольку эта команда не имеет других опций,  мы не даем  никаких
примеров. Тем не менее, давайте теперь рассмотрим наше другое средство
регистрации времени входа в систему.

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

     ИМЯ:      timelog
---------------------------------------------------------------------------

timelog    Учет и статистика времени

     НАЗНАЧЕНИЕ

     Интерфейсное меню для слежения и сопровождения файлов регистрации
времени.

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

timelog

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

timelog   Выводит на экран главное меню, из которого можно
          выбирать необходимое действие

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

1   :
2   # @(#) timelog v1.0 Time accounting and statistics
Author: Russ Sage
2а                        Учет и статистика времени

4   PROJ=""

6   while :
7   do
8          set `date`
9          echo "

11  $1, $2 $3                  $4

13          Time Logger
14          -----------          Project: $PROJ
15    s) Select a project file
16    c) Create a new project file
17    l) List current project files
18    v) View the project file
19    n) Turn billing on
Предыдущая страница Следующая страница
1 ... 31 32 33 34 35 36 37  38 39 40 41 42 43 44 ... 71
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (52)

Реклама