Термин «подоболочка» проблематичен, и даже 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
.