据我所知,变量赋值是相同的,无论它是否在“导出”之前。这是干什么用的?
它使赋值对子进程可见。
$ foo=bar $ bash -c 'echo $foo' $ export foo $ bash -c 'echo $foo' bar
一般取决于外壳。对于 bash,它将变量标记为“可导出”,这意味着它将显示在您运行的任何子进程的环境中。
bash
未导出的变量只能从 目前进程(shell)中看到。
来自 bash手册页:
export [-fn] [name[=word]] ... export -p < br > 将提供的名称标记为自动导出到随后执行的命令的环境。 如果给定了 -f选项,则名称引用函数。如果没有给出名称,或者提供了 -p选项,那么将打印在此 shell 中导出的所有名称的列表。 -n选项将导致从每个名称中删除导出属性。 如果变量名后跟 =word,则变量的值设置为 word。 除非遇到无效选项,或者某个名称不是有效的 shell 变量名,或者 -f提供了一个不是函数的名称,否则 export返回退出状态0。
export [-fn] [name[=word]] ... export -p < br >
export [-fn] [name[=word]] ...
export -p
将提供的名称标记为自动导出到随后执行的命令的环境。
如果给定了 -f选项,则名称引用函数。如果没有给出名称,或者提供了 -p选项,那么将打印在此 shell 中导出的所有名称的列表。
-f
-p
-n选项将导致从每个名称中删除导出属性。
-n
如果变量名后跟 =word,则变量的值设置为 word。
=word
word
除非遇到无效选项,或者某个名称不是有效的 shell 变量名,或者 -f提供了一个不是函数的名称,否则 export返回退出状态0。
export
您还可以使用 typeset命令将变量设置为可导出,并使用 set -a自动标记所有将来的变量创建或修改。
typeset
set -a
导出的变量(如 $HOME和 $PATH)可以(由)其他程序使用(继承) ,这些程序由将它们作为环境变量导出的 shell 运行(以及由这些其他程序运行的程序,等等)。正则(非导出)变量对其他程序不可用。
$HOME
$PATH
$ 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 手册的 命令分组命令分组和 命令执行环境下找到。