······errors=$(($errors + 1))
····fi
··done
··IFS=$oldIFS # Восстановить прежнее значение разделителя полей.
··# Следующие переменные должны содержать полные пути к файлам программ,
··#·· но могут быть не определены или содержать только имена программ.
··#·· Добавьте дополнительные переменные в комплект, если это
··#·· необходимо для вашего сайта и ваших пользователей.
··validate "EDITOR" $EDITOR
··validate "MAILER" $MAILER
··validate "PAGER" $PAGER
··# И в заключение вывод разных сообщений, в зависимости от значения errors
··if [$errors −gt 0]; then
····echo "Errors encountered. Please notify sysadmin for help."
··else
····echo "Your environment checks out fine."
··fi
··exit 0
Проверки, выполняемые сценарием, не отличаются большой сложностью. Чтобы проверить допустимость всех каталогов, перечисленных в переменной PATH, сценарий перебирает их и проверяет, существуют ли они
. Обратите внимание, что перед этим изменяется внутренний разделитель полей (IFS): в строке
ему присваивается двоеточие, благодаря чему сценарий может благополучно выполнить обход всех каталогов, перечисленных в переменной PATH. В соответствии с соглашениями, каталоги в переменной PATH отделяются друг от друга двоеточием:
$ echo $PATH
/bin/:/sbin:/usr/bin:/sw/bin:/usr/X11R6/bin:/usr/local/mybin
Допустимость переменных окружения оценивает функция validate()
, которая прежде всего проверяет, начинается ли значение каждой переменной с символа слеша (/). Если это условие выполняется, функция проверяет наличие указанного выполняемого файла. Если значение переменной не начинается с символа слеша (/), сценарий вызывает функцию in_path(), импортированную из библиотеки, написанную нами в сценарии № 1 (глава 1)
, которая проверяет присутствие программы в одном из каталогов, перечисленных в переменной PATH.
Самый необычный аспект сценария — использование значений по умолчанию в некоторых условных выражениях и в операции извлечения подстроки из переменной. Использование значений по умолчанию в условных выражениях вы видите в блоке, начинающемся со строки
. Синтаксис ${varname:?"errorMessage"} можно интерпретировать так: «Если переменная varname существует, вернуть ее значение; иначе завершить сценарий и вывести сообщение errorMessage».
Синтаксис извлечения подстроки из переменной ${varvalue%${varvalue#?}}, используемый в строке
, — это функция извлечения подстроки, определяемая стандартом POSIX, которая возвращает только первый символ из значения переменной varvalue. Таким образом сценарий определяет, является ли значение переменной полным путем к файлу (начинается с символа слеша / и определяет полный путь к программе).
Если ваша версия Unix/Linux не поддерживает этот синтаксис, его можно заменить более прямолинейными проверками. Например, использовать вместо ${SHELL:?No Shell} следующие строки:
if [-z "$SHELL"]; then
··echo "No Shell" >&2; exit 1
fi
А вместо {varvalue%${varvalue#?}} — следующую строку, дающую тот же результат:
$(echo $varvalue | cut −c1)
Этот сценарий пользователи могут запускать для проверки своего окружения. Он не принимает аргументов командной строки и запускается, как показано в листинге 5.22.
Листинг 5.22:Тестирование сценария validator
$ validator
** PATH contains invalid directory /usr/local/mybin.
** MAILER set to /usr/local/bin/elm, but I cannot find executable.
Errors encountered. Please notify sysadmin for help.
№ 44. Очистка гостевой учетной записи
Несмотря на то что по соображениям безопасности на многих сайтах запрещен вход с именем пользователя guest, кое-где такая гостевая учетная запись все еще используется (часто с легко угадываемым паролем), чтобы дать клиентам или сотрудникам из других отделов доступ к сети. Это бывает удобно, но есть одна большая проблема: когда одной учетной записью пользуется множество людей, существует опасность, что кто-то из них по неосторожности испортит ее настройки, затруднив работу тех, кто последует за ним. Такое может произойти, например, во время экспериментов с командами, при редактировании файлов .rc или добавлении подкаталогов, и так далее.
Читать дальше