导出的外壳变量与未使用bash的外壳变量之间的区别


41

Bash似乎可以区分已导出和未导出的变量。

例:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

set看到变量,但env看不到。

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

set查看两个变量,但env仅查看导出的变量。

我知道那set是内置的bash,env不是。

导出的变量与未导出的变量之间有什么区别?


17
术语注释:“环境变量”始终被导出。非导出变量是“外壳变量”(或“参数”)。
吉尔斯(Gillles)“所以-别再作恶了”

Answers:


44

导出的变量将携带到由导出它们的外壳程序执行的命令环境中,而未导出的变量是当前外壳程序调用的本地变量。从export手册页:

外壳程序应将export属性赋予与指定名称相对应的变量,这将使它们处于随后执行的命令的环境中。

set输出当前环境,其中包括任何本地非导出变量。env用于在新环境中启动程序,并且不带任何参数将输出该新环境是什么。由于env正在创建一个新环境,因此仅导出了变量,就像从该Shell启动的任何程序一样。例如,在第一个外壳中生成第二个外壳(我曾经$$在内部外壳中表示提示):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

请注意,导出的是变量,而不仅仅是其值。这意味着,一旦你export FOOFOO成为一个全局变量,并显示了在随后的环境中,即使后来改为:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$

因此,如果您只关心当前的shell,是否需要导出?另外,为什么locale当前的shell无法显示更新?
Pacerier
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.