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
不是。
导出的变量和未导出的变量有什么区别?
答案1
导出的变量将被带入导出它们的 shell 执行的命令环境中,而非导出的变量对于当前 shell 调用而言是本地的。从export
手册页:
shell 应将导出属性赋予与指定名称相对应的变量,这将使它们处于随后执行的命令的环境中。
set
输出当前环境,其中包括任何本地非导出变量。env
用于在新环境中启动程序,并且不带任何参数将输出新环境。由于env
正在创建新环境,因此仅引入导出的变量,就像从该 shell 启动的任何程序一样。例如,在第一个 shell 中生成第二个 shell(我用来$$
表示内 shell 中的提示):
$ FOO=BAR
$ bash
$$ echo $FOO # Note the empty line
$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$
请注意,导出的是变量,而不仅仅是其值。这意味着,一旦export FOO
,FOO
成为全局变量并出现在后续环境中,即使稍后更改:
$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$