据我所知,无论是否在变量之前加上 "export",变量的赋值方式都是相同的。那么 "export" 有什么作用呢?
$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
$
export
内置命令的条目,以及命令执行环境和环境部分。( ... )
和类似符号运行的子shell中可用,因为这些子shell是主shell的直接克隆。$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$
mysql
进程从 MYSQL_PWD
的环境变量获取值,但不会了解 MYSQL_PWD
的 shell 变量。 - David Tonhofer它使赋值对子进程可见。
$ foo=bar
$ bash -c 'echo $foo'
$ export foo
$ bash -c 'echo $foo'
bar
这通常取决于所使用的shell。对于bash
,它将变量标记为“可导出”,这意味着它将在您运行的任何子进程环境中显示。
未导出的变量仅在当前进程(即shell)中可见。
来自bash
man页面:
export [-fn] [name[=word]] ...
export -p
提供的变量名被标记为自动导出到后续执行的命令的环境中。
如果给出了
-f
选项,则名称是指函数。 如果未给出名称或提供-p
选项,则会打印出在此shell中导出的所有名称的列表。
-n
选项会从每个名称中删除导出属性。如果变量名后跟
=word
,则该变量的值设置为word
。
export
返回退出状态为0,除非遇到无效选项、其中一个名称不是有效的shell变量名称,或-f
与不是函数的名称一起使用。
您还可以使用typeset
命令将变量设置为可导出,并使用set -a
自动将所有未来变量创建或修改标记为可导出。