| Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки | ||
|---|---|---|
| Назад | Вперед | |
|
Практически никто не знает грамматики Bourne shell-а. Даже изучение исходных текстов не дает ее полного понимания. |
|
| Tom Duff |
В интеракивном режиме, оболочка читает команды, вводимые пользователем, с устройства tty. Кроме того, такая оболочка считывает конфигурационные файлы на запуске, выводит строку приглашения к вводу (prompt), и, по-умолчанию, разрешает управление заданиями. Пользователь имеет возможность взаимодействия с оболочкой.
Сценарий всегда запускается в неинтерактивном режиме. Но, не смотря на это, он сохраняет доступ к своему tty. И даже может эмулировать интерактивный режим работы.
#!/bin/bash
MY_PROMPT='$ '
while :
do
echo -n "$MY_PROMPT"
read line
eval "$line"
done
exit 0
# Этот сценарий, как иллюстрация к вышесказанному, предоставлен
# Stephane Chazelas (спасибо).
Будем считать интерактивным такой сценарий,
который может принимать ввод от пользователя, обычно с помощью
команды read (см. Пример 11-2). В "реальной жизни" все намного
сложнее. Пока же, будем придерживаться предположения о том, что
интерактивный сценарий ограничен рамками tty, с которого
сценарий был запущен пользователемa, т.е консоль или окно
xterm.
Сценарии начальной инициализации системы не являются
интерактивными, поскольку они не предполагают вмешательство
человека в процессе своей работы. Большая часть сценариев,
выполняющих администрирование и обслуживание системы -- так же
работают в неинтерактивном режиме. Многие задачи автоматизации
труда администратора очень трудно представить себе без
неинтерактивных сценариев.
Неинтерактивные сценарии прекрасно могут работать в фоне, в
то время, как интерактивные -- подвисают, останавливаясь на
операциях, ожидающих ввода пользователя. Сложности, возникающие
с запуском интерактивных сценариев в фоновом режиме, могут быть
преодолены с помощью expect-сценария или встроенного документа. В
простейших случаях, можно организовать перенаправление ввода из
файла в команду read (read variable <file). Эти приемы
позволят создавать сценарии, которые смогут работать как в
интерактивном, так и в неинтерактивном режимах.
Если внутри сценария необходимо проверить режим работы --
интерактивный или неинтерактивный, это можно сделать проверкой
переменной окружения $PS1.
if [ -z $PS1 ] # интерактивный режим?
then
# неинтерактивный
...
else
# интерактивный
...
fi
Еще один способ -- проверка установки флага
"i" в переменной $-.
case $- in
*i*) # интерактивный режим
;;
*) # неинтерактивный режим
;;
# (Из "UNIX F.A.Q.," 1993)

Сценарий может принудительно запускаться в
интерактивном режиме, для этого необходимо указать ключ
-i в строке-заголовке #!/bin/bash
-i. Однако вы должны помнить о том, что в
таких случаях сценарий может выдавать сообщения об
ошибках даже тогда, когда ошибок, по сути, нет.