Процесс под-оболочки не сможет получить доступ к переменным и функциям, определенным в родительской оболочке - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть 3 скрипта в одном каталоге, пожалуйста, найдите ниже содержимое x.sh, y.sh и z.sh: -

x.sh: -

xData="DataOfX"

function xInit(){
    echo "xInit : data of a >$xData<"
}

y.sh: -

. x.sh

xInit

sh z.sh zInit

z.sh: -

function zInit(){
    echo "zInit of z"
    xInit
}

$@

Выполнение

. y.sh

в том же каталоге выдает следующий вывод: -

xInit : data of a >DataOfX<
zInit of z
z.sh: line 3: xInit: command not found

Как процесс под-оболочки может получить доступ к переменным и функциям, инициализированным в родительской оболочке?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Термин «подоболочка» проблематичен, и даже man bash несовместим в том, как он используется. Строго говоря, под-оболочка - это еще одно окружение оболочки, которое наследует все функции, включая все переменные, родительского элемента.

Круглые скобки дают подоболочку. Переменная BASH_SUBSHELL дает уровень подоболочки, а $$ дает PID оболочки (в подоболочках она имитируется как PID родительского объекта).

$ x=42

$ echo $BASH_SUBSHELL, $x, $$
0, 42, 1130
$ (echo $BASH_SUBSHELL, $x, $$)
1, 42, 1130
$ ( (echo $BASH_SUBSHELL, $x, $$) )
2, 42, 1130

Когда вы выполняете скрипт, это не подоболочка . Возьми скрипт gash.sh с:

echo $BASH_SUBSHELL, $x, $$

Запуск его как:

$ ./gash.sh
0, , 8419

Обратите внимание на пробел, потому что x не копируется. Это не подоболочка, а PID другой. Четный

$ (./gash.sh)
1, , 8421

это подоболочка, выполняющая дочерний процесс, поэтому она тоже не работает.

Вам необходимо переместить переменную в блок среды , который копируется в дочерние процессы, используя export:

$ export x
$ ./gash.sh
0, 42, 8423

Переменные, которые не экспортируются, доступны только в подоболочках, использующих ( ), но не другие дочерние процессы. Для функций используйте export -f.

0 голосов
/ 02 сентября 2018

Добавление export должно сделать работу:

export xData="DataOfX"

https://www.tutorialspoint.com/unix_commands/export.htm

команда export - одна из команд BUILTINS оболочки bash, которая означает, что это часть вашей оболочки. Команда экспорта довольно проста для используйте, так как он имеет простой синтаксис только с тремя доступными командами опции. В общем, команда экспорта помечает переменную среды экспортироваться с любыми вновь разветвленными дочерними процессами и, таким образом, позволяет дочернему процессу наследовать все отмеченные переменные.

...