为什么导出似乎不会影响子 shell?

为什么导出似乎不会影响子 shell?

如果我有

$ x='This is a String'
$ export x

$ xterm &
[3] 14089

子进程似乎没有响应

$echo $x
$

更新: 我第一次导出变量时它似乎跨越了一个进程? -

$ export xb
[1]+  Done                    xterm
durrantm.../durrantm$ export xb
durrantm.../durrantm$ 
# Note second export didn't say anything.

答案1

一旦子进程被分叉,您就无法将父进程的环境导出到其任何子进程中。子级是分叉的外壳,当旋转时,它们会获得父级当时环境的副本。从那时起,他们就只能靠自己了。

在您的情况下,您在分叉之前设置变量,因此您应该看到在任何子项中设置的任何变量。不过,您似乎遇到了拼写错误。尝试echo $x

例子

在父外壳中:

$ x='This is a String'
$ export x
$ xterm &
[1] 28578

在 xterm 中:

$ echo $x
This is a String

变量被登录文件重置?

在某些罕见的情况下,您可能会遇到一个迷失变量set,或者unset它会消除父级的环境变量,使其无法干净地传递给任何子级。您可以按如下方式检查:

# login shell
$ bash -c -l 'echo $x'
This is a String

# interactive shell
$ bash -c -i 'echo $x'
This is a String

您还可以使用 Bash 的-x开关,使上面的输出更加详细。

$ bash -x -c -i 'echo $x'

相关内容