Чтение онлайн

на главную - закладки

Жанры

UNIX — универсальная среда программирования
Шрифт:

s/:$/:./

s/:/ /g'`

do

 if test -f $i/$1 # use test -x if you can

 then

echo $i/$1

exit 0 # found it

 fi

done

exit 1 # not found

$

Проверим ее:

$ cx which
Сделаем ее выполняемой

$ which which

./which

$ which ed

/bin/ed

$ mv which /usr/you/bin

$ which which

/usr/you/bin/which

$

Первый оператор

case
осуществляет контроль ошибки. Обратите внимание на переключение
1>&2
в команде
echo
, которое выполняется для того, чтобы сообщение об ошибке не пропало в программном канале. Встроенная команда интерпретатора
exit
может использоваться для передачи кода завершения. В нашем примере
exit 2
передает код завершения в ситуации, когда команда не выполняется,
exit 1
— в ситуации, когда файл не удалось найти, и
exit 0
— в ситуации, когда файл найден. Если нет явного оператора
exit
, кодом завершения командного файла является код завершения последней выполняемой команды.

Что произойдет, если в вашем текущем каталоге есть программа под именем

test
? (Мы предполагаем, что
test
не является встроенной командой.)

$ echo 'echo hello' >test
Сделаем поддельную команду test

$ cx test
Сделаем ее выполняемой

$ which which
Попробуем which теперь

hello
Неудача!

./which

$

Вывод: требуется больший контроль. Можно запустить команду

which
(если нет команды
test
в текущем каталоге), чтобы определить полное имя для
test
и задать его явно. Но это не лучшее решение, поскольку команда
test
может присутствовать в различных каталогах в разных версиях системы, а команда
which
зависит от
sed
и
echo
, так что необходимо указать и их полные имена. Можно поступить проще — установить значение
PATH
в командном файле так, чтобы поиск команд осуществлялся только в
/bin
и
/usr/bin
. Конечно, это возможно только в команде
which
, причем прежнее значение
PATH
следует сохранить для определения последовательности каталогов при поиске.

$ cat which

# which cmd: which cmd in PATH is executed, final version

opath=$PATH

PATH=/bin:/usr/bin

case $# in

0) echo 'Usage: which command' 1>&2; exit 2

esac

for i in `echo $opath | sed 's/^:/.:/

s/::/:.:/g

s/ :$/:./

s/:/ /g'`

do

 if test -f $i/$1 # this is /bin/test

 then # or /usr/bin/test only

echo $i/$1

exit 0 # found it

 fi

done

exit 1 # not found

$

Теперь команда

which
выполняется даже в том случае, если есть "поддельная" команда
test
(
sed
или
echo
) среди каталогов, входящих в
PATH
.

$ ls -l test

– rwxrwxrwx 1 you 11 Oct 1 06:55 test
Все еще здесь

$ which which

/usr/you/bin/which

$ which test

./test

$ rm test

$ which test

/bin/test

$

В языке

shell
имеются две операции, объединяющие команды
||
и
&&
, использование которых часто более компактно и удобно, чем оператора
if
. Например, операция
||
может заменить некоторые операторы
if
:

test -f имя_файла || echo имя_файла не существует

эквивалентно

if test !
– f имя_файла
! обращает условие

then

 echo имя файла не существует

fi

Операция

||
, несмотря на свой вид, не имеет ничего общего с конвейерами — это обычная операция, означающая ИЛИ. Выполняется команда слева от
||
. Если ее код завершения 0 (успех), справа от
||
команда игнорируется. Если команда слева возвращает другое значение (неудача), выполняется команда справа, и значение всего выражения есть код завершения правой команды. Иными словами,
||
представляет собой обычную операцию ИЛИ, которая не выполняет свою правую часть, если левая часть завершилась успешно. Соответственно
&&
есть обычная операция И, выполняющая свою правую часть, только если левая часть завершилась успешно.

Упражнение 5.4

Почему в команде

which
перед выходом из нее не восстанавливается значение
PATH
из
opath
?

Упражнение 5.5

Если в языке

shell
используется
esac
для завершения оператора
case
и
fi
для завершения оператора
if
, почему для завершения оператора
do
применяется
done
?

Упражнение 5.6

Введите в команду

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

Подсказка:

match='exit 0'

Упражнение 5.7

Модифицируйте команду

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

Упражнение 5.8

Модифицируйте команду

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

5.3 Циклы

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

Поделиться:
Популярные книги

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам

Товарищ "Чума"

lanpirot
1. Товарищ "Чума"
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Товарищ Чума

Дневники 1928-1929

Пришвин Михаил Михайлович
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Дневники 1928-1929

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4

Журнал «Если», 2007 № 04

Олди Генри Лайон
4. Журнал "Если" 2007
Фантастика:
научная фантастика
7.00
рейтинг книги
Журнал «Если», 2007 № 04

Инженер Петра Великого 2

Гросов Виктор
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Инженер Петра Великого 2

Потомок бога

Решетов Евгений Валерьевич
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
Потомок бога

Корсаков

Кощеев Владимир
1. Корсаков
Фантастика:
альтернативная история
аниме
попаданцы
5.00
рейтинг книги
Корсаков

Новое восстание

Раш Кристин Кэтрин
139. Звездные войны
Фантастика:
боевая фантастика
5.00
рейтинг книги
Новое восстание

Недорогая еда

Барановский Виктор Александрович
Дом и Семья:
кулинария
6.25
рейтинг книги
Недорогая еда

Лекарь Империи 4

Карелин Сергей Витальевич
4. Лекарь Империи
Фантастика:
городское фэнтези
аниме
попаданцы
5.00
рейтинг книги
Лекарь Империи 4

Вторжение

Гагарин Станислав Семенович
Фантастика:
детективная фантастика
4.50
рейтинг книги
Вторжение

Аспирант

Поселягин Владимир Геннадьевич
3. Рунный маг
Фантастика:
боевая фантастика
4.50
рейтинг книги
Аспирант