UNIX — универсальная среда программирования - Керниган Брайан Уилсон Страница 63

Тут можно читать бесплатно UNIX — универсальная среда программирования - Керниган Брайан Уилсон. Жанр: Компьютеры и Интернет / Интернет. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте «WorldBooks (МирКниг)» или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
UNIX — универсальная среда программирования - Керниган Брайан Уилсон

UNIX — универсальная среда программирования - Керниган Брайан Уилсон краткое содержание

Прочтите описание перед тем, как прочитать онлайн книгу «UNIX — универсальная среда программирования - Керниган Брайан Уилсон» бесплатно полную версию:

UNIX — универсальная среда программирования - Керниган Брайан Уилсон читать онлайн бесплатно

UNIX — универсальная среда программирования - Керниган Брайан Уилсон - читать книгу онлайн бесплатно, автор Керниган Брайан Уилсон

Упражнение 5.6

Введите в команду which флаг -а, чтобы выводились все файлы из PATH, а не только первый найденный.

Подсказка: match='exit 0'

Упражнение 5.7

Модифицируйте команду which так, чтобы она учитывала встроенные в язык shell команды типа exit.

Упражнение 5.8

Модифицируйте команду which так, чтобы она проверяла права доступа файлов. Как изменить ее для получения диагностического сообщения, если файл не удалось найти?

5.3 Циклы while и until: контроль входа в систему

В гл. 3 цикл for использовался для нескольких итеративных программ. Обычно цикл for охватывает множество имен файлов, как в 'for i in * .с', или все аргументы командного файла, как в 'for i in $*'. Но циклы в языке shell могут быть более общими, чем в этих идиомах, например цикл for в команде which.

Имеются три вида циклов: for, while и until. Чаще всего используется цикл for. В нем выполняется последовательность команд (тело цикла) для каждого элемента из множества слов. В большинстве случаев множество образуют просто имена файлов. В циклах while и until контроль над выполнением тела цикла осуществляется с помощью кода завершения команды. Тело цикла выполняется до тех пор, пока команда условия не вернет ненулевой код для while или нуль для until. Циклы while и until идентичны, за исключением кода завершения команды.

Ниже приведены основные формы каждого цикла:

for i in список слов

do

 тело цикла, $i последовательно получает значения элементов

done

for i (явно перечисляются аргументы командного файла, т.е. $*)

do

 тело цикла, $i последовательно получает значения аргументов

done

while команда

do

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

done

until команда

do

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

done

Вторая форма цикла for, в которой пустой список обозначается как $*, является удобным сокращением записи для наиболее типичного использования.

Командой условия, управляющей циклами while или until, может быть любая команда. Очевидным примером служит цикл while, в котором осуществляется контроль входа (пусть Мэри) в систему:

while sleep 60

do

 who | grep mary

done

Команда sleep, устанавливающая паузу на 60 с, всегда выполняется нормально (если ее не прервали) и, значит, всегда возвращает код "успех", поэтому в цикле раз в минуту будет проверяться, находится ли Мэри в системе. Недостаток такого решения состоит в том, что если Мэри уже вошла в систему, то нужно ждать 60 с, чтобы узнать об этом. О продолжении же работы Мэри в системе каждую минуту будет поступать сообщение. Цикл можно перевернуть и записать с помощью until, чтобы получать информацию сразу без задержки, если Мэри в данный момент работает в системе:

until who | grep mary do

 sleep 60

done

Теперь условие представляется более интересным. Если Мэри вошла в систему, то 'who | grep mary' выдаст запись о ней из списка команды who и вернет код "истина". Это связано с тем, что grep выдает код завершения, показывающий, удалось ли ей найти что-нибудь, а код завершения конвейера есть код завершения последней команды.

В заключение мы можем оформить команду, дав ей имя и установив в системе:

$ cat watchfor

# watchfor: watch for someone to log in

PATH=/bin:/usr/bin case $# in

0) echo 'Usage: watchfor person' 1>&2; exit 1

esac

until who | egrep "$1"

do

 sleep 60

done

$ cx watchfor

$ watchfor you

you tty0 Oct 1 08:01       Работает

$ mv watchfor /usr/you/bin Установим в системе

$

Мы заменили grep на egrep, чтобы было можно задавать

$ watchfor 'joe | mary'

и следить за несколькими пользователями.

Более сложный пример: можно контролировать вход в систему и выход из нее всех пользователей и сообщать обо всех фактах входа или выхода. Это можно рассматривать как некоторое дополнение к команде who. Основная идея проста: раз в минуту запускать команду who и сравнивать результат ее действия с результатом, полученным минутой ранее, сообщая обо всех различиях. Вывод команды who хранится в файле, и мы можем записывать его в каталог /tmp. Чтобы отличить свои файлы от файлов, принадлежащих другим процессам, в имена файлов вставляется переменная интерпретатора $$ (номер процесса команды интерпретатора), что является обычной практикой. Имя команды упоминается во временных файлах главным образом для администратора системы. Часто команды (включая данную версию watchfor) оставляют после себя файлы в /tmp, и полезно знать, какая команда это сделала. Здесь ":" — встроенная команда, которая

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.