假设我的 bash shell 有以下环境变量:
export a="Hello World"
如果我从 bash shell 执行一个进程,则a
该子进程将继承该环境变量。
我的问题是:会a
被子进程继承为环境变量还是shell变量,即会a
在子进程中被导出吗?
答案1
作为环境变量。
这意味着子进程启动的任何子进程也将继承该变量。
测试:
$ export FOO=bar
$ sh
$ sh
$ sh
$ echo "$FOO"
bar
$ exit
$ exit
$ exit
上面,创建环境变量的 shellFOO
启动了一个新的交互式 shell。那开始了另一件事,那件事又开始了另一件事。这曾孙壳内,$FOO
有着价值bar
。
另一个测试表明,如果子 shell 更改了环境变量,则更改将被转移到以后的子 shell 中(但不会传播到父 shell):
$ export FOO=bar
$ ( ( echo "$FOO"; FOO=quux; ( ( ( echo "$FOO" ) ) ) ) )
bar
quux
$ echo "$FOO"
bar
FOO
(在这个例子中,导出并不重要,因为子 shell 也继承 shell 变量,但如果每个都是完全独立的进程,( ... )
效果将是相同的)( ... )
请注意,环境变量可用于任何进程从 shell 启动,而不仅仅是 shell 脚本。 C 程序或脚本将它们继承为 shell 变量是没有意义的,awk
因为这些语言中没有此类变量的概念(环境变量严格来说是键值对,而 shell 变量可以键入为整数,请阅读-仅、数组、关联数组等,具体取决于 shell 的功能)。
答案2
您可以从 /proc/PID/environ 读取进程环境变量。因此,当您导出变量时,它会在此 /proc“文件”中声明。