Введите в команду which
флаг -а
, чтобы выводились все файлы из PATH
, а не только первый найденный.
match='exit 0'
Модифицируйте команду which
так, чтобы она учитывала встроенные в язык shell
команды типа exit
.
Модифицируйте команду 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'
и следить за несколькими пользователями.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии