Опции Bash и интерактивные оболочки

Они переходят к любому терминалу, с которого был запущен X-сервер. Если Вы загружаетесь к командной строке и затем запускаетесь X, Вы видите их путем скачкообразного движения назад, к которому VT (поражал Ctrl-Alt-F1). Если Вы загружаетесь непосредственно к X, я не уверен, где сообщения обнаруживаются по умолчанию; это может варьироваться дистрибутивом.

2
22.12.2011, 13:32
4 ответа

Bash также определит, является ли это интерактивным путем исследования, если его ввод/вывод присоединен к терминалу.

-s неинтерактивный переключатель позволяет сценарию удара обрабатывать позиционные параметры при чтении команд из файла. например:

$ cat demo.sh
echo '$0 = ' $0
echo '$1 = ' $1
echo '$2 = ' $2

$ bash < demo.sh foo bar
bash: foo: No such file or directory

$ bash -s < demo.sh foo bar
$0 =  bash
$1 =  foo
$2 =  bar
4
27.01.2020, 21:51

-s опция заставляет удар читать команды из своего стандартного входа. Без этой опции удар рассматривает свой первый аргумент как название сценария для выполнения. При использовании этой опции удар рассматривает все свои аргументы как аргументы сценарию, что это читает на стандартном входе. -s опция только определяет, как удар интерпретирует свои параметры командной строки, не, является ли экземпляр оболочки интерактивным.

Экземпляр удара является всегда интерактивным, если он запускается с -i опция. Без -i, это является интерактивным, только если никакое название сценария не передается (-s влияния это), и и стандартный вход и стандартная погрешность подключены к терминалу.

Тестирование PS1 не говорит Вам, является ли экземпляр оболочки интерактивным. ¹ Вы может сбросить PS1 в интерактивной оболочке. С другой стороны неинтерактивная оболочка часто наследовалась PS1 от его среды. Надежный способ протестировать, если оболочка работает в интерактивном режиме, состоит в том, чтобы протестировать если $- содержит i.

read встроенные работы от любой оболочки, интерактивной или нет. Это читает из того, что подключено к стандартному входу оболочки (если не перенаправлено). При попытке читать из того же дескриптора файла, где удар читает сценарий, он выполняется, Вы закончите тем, что пропустили строку в сценарии (не обязательно в месте, которое Вы предназначили); например, если Вы передаете сценарий стандартному входу удара, и Вы хотите считать строку из терминала, необходимо перенаправить read вызов: read line </dev/tty.

Дескрипторы файлов 0, 1 и 2 всегда существуют (если они не были закрыты); они - стандартный вход, стандартный вывод и стандартная погрешность соответственно. Является ли оболочка интерактивной или не является не связанной с тем, на что указывают стандартные дескрипторы, за исключением того, что, являются ли fd 0 и 2 терминалами, влияет на интерактивное состояние оболочки.

¹ Да, я знаю, что существуют веб-страницы, которые требуют этого. Они неправы.

3
27.01.2020, 21:51

Немного больше информации об интерактивных оболочках:

Можно узнать, является ли оболочка интерактивной или не путем проверки $-. Если $- содержит i, затем оболочка является интерактивной.

Оболочка является интерактивной, когда она читает вход от пользователя непосредственно. Неинтерактивная оболочка читает команды из файла линию за линией и выполняет их. Это не делает оболочку интерактивной при чтении чего-либо из stdin из сценария, поскольку "сценарий читает вход, не оболочка" (не знайте, как объяснить это немного лучше).

    labdebian# cat ./test
    #!/bin/bash
    echo Hello World
    echo $-
    read; echo $REPLY
    echo $-

    labdebian# bash test
    Hello World
    hB
    I'm typing this
    I'm typing this
    hB

    labdebian# bash -i test
    Hello World
    himB
    I'm typing this
    I'm typing this
    himB
2
27.01.2020, 21:51
  • 1
    То, что сбивало с толку, находится в документация для удара, они говорят, что это зависнет при использовании чтения в не - интерактивная оболочка –  rubixibuc 27.12.2011, 04:15

-s не делает Вашу оболочку интерактивной. Использовать -i вместо этого.

0
27.01.2020, 21:51

Теги

Похожие вопросы