我想澄清我对 shell 变量与环境变量的困惑。我做了以下测试,其中我有一个 shell 变量abc
并将export
其设置为环境变量。
$
$ abc="shell var"
$ env | grep abc
$ echo $abc
shell var
$ export abc="env var"
$ env | grep abc
abc=env var
$ echo $abc
env var
$ unset abc
$ env | grep abc
$ echo $abc
$
导出完成后,我尝试echo $abc
。
问题:
Export 是否将变量
abc
从 shell 移动到环境中,还是在环境中创建一个副本并为其分配新值?当第二个
echo
完成后export
,是否echo
检查是否abc
在环境中然后打印它,或者已abc
完全从外壳中删除并且仅存在于环境中,这就是为什么echo
打印其值?
答案1
export 是否将变量 abc 从 shell 移动到环境中,或者是否在环境中创建一个副本并为其分配新值?
两者都不。 export
只是标记一个用于导出的变量。
当执行外部命令时,shell 会创建一个环境来传递给它。只有标记为导出的变量才会添加到该环境中。解释如下man bash
:
标记为导出的 shell 变量和函数,以及为命令导出的变量,都在环境中传递
请注意,这env
是一个外部的命令。因此,它只能报告已导出的变量。
“为命令导出的变量”的含义
普通变量赋值具有持久性:变量一直存在,直到被删除(取消设置)为止。还可以创建临时变量以供特定命令使用。
作为示例,让我们创建一个a
供命令使用的变量env
:
$ a=b env | grep ^a=
a=b