Я смущен тем, экспортируются ли переменные bash
в подоболочки и когда они доступны сценариям. Мой опыт до сих пор привел меня к мысли, что переменные bash автоматически доступны для подоболочек. Например.:
> FOO=bar
> echo $FOO
bar
> (echo $FOO)
bar
Вышеприведенное показывает, что переменные bash
доступны в подоболочках.
Учитывая этот скрипт:
#! /usr/bin/bash
# c.sh
func()
{
echo before
echo ${FOO}
echo after
}
func
Я понимаю, что вызов скрипта в текущем контексте оболочки дает ему доступ к текущим переменным оболочки:
> . ./c.sh
before
bar
after
Если бы я вызывал скрипт без прецедента "точка-пробел"...
> ./c.sh
before
after
... разве это не тот случай, когда скрипт вызывается в подоболочке? Если это так, а также верно то, что переменные текущей оболочки доступны для подоболочек (как я понял из самого первого блока кода), почему $FOO
недоступна для c.sh
при таком запуске?
Точно так же, почему $FOO
также недоступен, когда c.sh
запускается в круглых скобках, что, как я понял, означает выполнение выражения в подоболочке:
> (./c.sh)
before
after
(Если это не загрязняет этот пост слишком большим количеством вопросов: если «./c.sh
» и «(./c.sh)
» оба запускают скрипт в подоболочке текущей оболочки, в чем разница между двумя способами вызова?)
./foo
не запускаетfoo
в подоболочке: это совершенно не связанный дочерний процесс, находящийся не только за границейfork()
, но и за границейexecve()
. - person Charles Duffy   schedule 18.08.2018(./c.sh)
разветвляет подоболочку, а затем запускает дочерний процесс внутри нее, поэтому дочерний процесс является внуком, а не прямым дочерним элементом исходной оболочки, и у вас есть границаexecv
между дочерним элементом и внуком ( хотя между родителем и ребенком нет). - person Charles Duffy   schedule 18.08.2018shell
, поэтому я хотел бы отметить, что не все оболочки обрабатывают вложенные оболочки так же, какbash
. Оболочка Korn, например, избегает создания дочернего процесса для вложенной оболочки. - person cdarke   schedule 18.08.2018(...)
без использования подоболочек, насколько это возможно (когда невозможно соблюдать семантику POSIX без создания подоболочки, создается подоболочка; неверно подразумевать, что(...)
вообще их не использует). Чтение вышеизложенного как просьба отредактировать мой ответ, чтобы больше не указывать, что(...)
запрашивает подоболочку (по сравнению с запросом независимой среды, наиболее легко реализуемой с помощью подоболочки), является справедливым. - person Charles Duffy   schedule 19.08.2018