Bash - shell 与环境变量

Bash - shell 与环境变量

我想澄清我对 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

相关内容