33.1. Интерактивный и неинтерактивный режим работы | Популярный Linux

Опубликовано Bash в Ср, 23/12/2009 — 21:04


В интеракивном режиме, оболочка читает команды, вводимые пользователем, с устройства tty. Кроме того, такая оболочка считывает конфигурационные файлы на запуске, выводит строку приглашения к вводу (prompt), и, по-умолчанию, разрешает управление заданиями. Пользователь имеет возможность взаимодействия с оболочкой.

Сценарий всегда запускается в неинтерактивном режиме. Но, не смотря на это, он сохраняет доступ к своему tty. И даже может эмулировать интерактивный режим работы.

  1. #!/bin/bash
  2. MY_PROMPT=‘$ ‘
  3. while :
  4. do
  5.   echo -n «$MY_PROMPT«
  6.   read line
  7.   eval «$line«
  8.   done
  9. exit 0
  10. # Этот сценарий, как иллюстрация к вышесказанному, предоставлен
  11. # Stephane Chazelas (спасибо).

Будем считать интерактивным такой сценарий, который может принимать ввод от пользователя, обычно с помощью команды read (см. Пример 11-2). В «реальной жизни» все намного сложнее. Пока же, будем придерживаться предположения о том, что интерактивный сценарий ограничен рамками tty, с которого сценарий был запущен пользователемa, т.е консоль или окно xterm.

Сценарии начальной инициализации системы не являются интерактивными, поскольку они не предполагают вмешательство человека в процессе своей работы. Большая часть сценариев, выполняющих администрирование и обслуживание системы — так же работают в неинтерактивном режиме. Многие задачи автоматизации труда администратора очень трудно представить себе без неинтерактивных сценариев.

Неинтерактивные сценарии прекрасно могут работать в фоне, в то время, как интерактивные — подвисают, останавливаясь на операциях, ожидающих ввода пользователя. Сложности, возникающие с запуском интерактивных сценариев в фоновом режиме, могут быть преодолены с помощью expect-сценария или встроенного документа. В простейших случаях, можно организовать перенаправление ввода из файла в команду read (read variable <file). Эти приемы позволят создавать сценарии, которые смогут работать как в интерактивном, так и в неинтерактивном режимах.

Если внутри сценария необходимо проверить режим работы — интерактивный или неинтерактивный, это можно сделать проверкой переменной окружения $PS1.

  1. if [ -z $PS1 ] # интерактивный режим?
  2. then
  3.   # неинтерактивный
  4.   …
  5. else
  6.   # интерактивный
  7.   …
  8. fi

Еще один способ — проверка установки флага
«i» в переменной
$-.

  1. case $- in
  2. *i*)    # интерактивный режим
  3. ;;
  4. *)      # неинтерактивный режим
  5. ;;
  6. # (Из «Unix F.A.Q.,» 1993)
Note

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

Запись опубликована в рубрике Без рубрики. Добавьте в закладки постоянную ссылку.