“ export”在 shell 编程中做什么?

据我所知,变量赋值是相同的,无论它是否在“导出”之前。这是干什么用的?

123484 次浏览

它使赋值对子进程可见。

$ foo=bar
$ bash -c 'echo $foo'


$ export foo
$ bash -c 'echo $foo'
bar

一般取决于外壳。对于 bash,它将变量标记为“可导出”,这意味着它将显示在您运行的任何子进程的环境中。

未导出的变量只能从 目前进程(shell)中看到。

来自 bash手册页:

export [-fn] [name[=word]] ...
export -p < br >

将提供的名称标记为自动导出到随后执行的命令的环境。

如果给定了 -f选项,则名称引用函数。如果没有给出名称,或者提供了 -p选项,那么将打印在此 shell 中导出的所有名称的列表。

-n选项将导致从每个名称中删除导出属性。

如果变量名后跟 =word,则变量的值设置为 word

除非遇到无效选项,或者某个名称不是有效的 shell 变量名,或者 -f提供了一个不是函数的名称,否则 export返回退出状态0。

您还可以使用 typeset命令将变量设置为可导出,并使用 set -a自动标记所有将来的变量创建或修改。

导出的变量(如 $HOME$PATH)可以(由)其他程序使用(继承) ,这些程序由将它们作为环境变量导出的 shell 运行(以及由这些其他程序运行的程序,等等)。正则(非导出)变量对其他程序不可用。

$ env | grep '^variable='
$                                 # No environment variable called variable
$ variable=Hello                  # Create local (non-exported) variable with value
$ env | grep '^variable='
$                                 # Still no environment variable called variable
$ export variable                 # Mark variable for export to child processes
$ env | grep '^variable='
variable=Hello
$
$ export other_variable=Goodbye   # create and initialize exported variable
$ env | grep '^other_variable='
other_variable=Goodbye
$

有关更多信息,请参见 GNUBash 手册中的 内置 export条目以及 命令执行环境环境章节。

注意,通过 ( ... )和类似的表示法运行的子 shell 可以使用未导出的变量,因为这些子 shell 是主 shell 的直接克隆:

$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$

子 shell 可以更改任何变量的自身副本,无论是否导出,并且可能影响它所运行的进程所看到的值,但是子 shell 的更改当然不能影响父 shell 中的变量。

关于 subshell 的一些信息可以在 Bash 手册的 命令分组命令分组命令执行环境下找到。