继承的环境变量会作为环境变量继承还是作为shell变量继承?

继承的环境变量会作为环境变量继承还是作为shell变量继承?

假设我的 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“文件”中声明。

相关内容