Они переходят к любому терминалу, с которого был запущен X-сервер. Если Вы загружаетесь к командной строке и затем запускаетесь X, Вы видите их путем скачкообразного движения назад, к которому VT (поражал Ctrl-Alt-F1). Если Вы загружаетесь непосредственно к X, я не уверен, где сообщения обнаруживаются по умолчанию; это может варьироваться дистрибутивом.
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
-s
опция заставляет удар читать команды из своего стандартного входа. Без этой опции удар рассматривает свой первый аргумент как название сценария для выполнения. При использовании этой опции удар рассматривает все свои аргументы как аргументы сценарию, что это читает на стандартном входе. -s
опция только определяет, как удар интерпретирует свои параметры командной строки, не, является ли экземпляр оболочки интерактивным.
Экземпляр удара является всегда интерактивным, если он запускается с -i
опция. Без -i
, это является интерактивным, только если никакое название сценария не передается (-s
влияния это), и и стандартный вход и стандартная погрешность подключены к терминалу.
Тестирование PS1
не говорит Вам, является ли экземпляр оболочки интерактивным. ¹ Вы может сбросить PS1
в интерактивной оболочке. С другой стороны неинтерактивная оболочка часто наследовалась PS1
от его среды. Надежный способ протестировать, если оболочка работает в интерактивном режиме, состоит в том, чтобы протестировать если $-
содержит i
.
read
встроенные работы от любой оболочки, интерактивной или нет. Это читает из того, что подключено к стандартному входу оболочки (если не перенаправлено). При попытке читать из того же дескриптора файла, где удар читает сценарий, он выполняется, Вы закончите тем, что пропустили строку в сценарии (не обязательно в месте, которое Вы предназначили); например, если Вы передаете сценарий стандартному входу удара, и Вы хотите считать строку из терминала, необходимо перенаправить read
вызов: read line </dev/tty
.
Дескрипторы файлов 0, 1 и 2 всегда существуют (если они не были закрыты); они - стандартный вход, стандартный вывод и стандартная погрешность соответственно. Является ли оболочка интерактивной или не является не связанной с тем, на что указывают стандартные дескрипторы, за исключением того, что, являются ли fd 0 и 2 терминалами, влияет на интерактивное состояние оболочки.
¹ Да, я знаю, что существуют веб-страницы, которые требуют этого. Они неправы.
Немного больше информации об интерактивных оболочках:
Можно узнать, является ли оболочка интерактивной или не путем проверки $-
. Если $-
содержит 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
-s
не делает Вашу оболочку интерактивной. Использовать -i
вместо этого.