“子壳”这个术语是有问题的,甚至man bash
它的使用方式不一致。严格来说,子 shell 是另一个 shell 环境,它继承父 shell 的所有功能,包括所有变量。
括号给出了一个子shell。变量BASH_SUBSHELL
给出level子壳,和$$
给出PID
shell 的 PID(在子 shell 中,它被伪造为父 shell 的 PID)。
$ x=42
$ echo $BASH_SUBSHELL, $x, $$
0, 42, 1130
$ (echo $BASH_SUBSHELL, $x, $$)
1, 42, 1130
$ ( (echo $BASH_SUBSHELL, $x, $$) )
2, 42, 1130
当您执行脚本时,这不是一个子shell。拿一个脚本gash.sh
with:
echo $BASH_SUBSHELL, $x, $$
运行它作为:
$ ./gash.sh
0, , 8419
注意空白,因为x
不被复制。它不是子shell,并且PID不同。甚至
$ (./gash.sh)
1, , 8421
这是一个运行子进程的子shell,所以这也不起作用。
您需要将变量移动到环境块,将其复制到子进程,使用export
:
$ export x
$ ./gash.sh
0, 42, 8423
未导出的变量只能在子 shell 中使用( )
,而不是其他子进程。对于函数使用export -f
.