在shell编程中,“export”是什么意思?

145
据我所知,无论是否在变量之前加上 "export",变量的赋值方式都是相同的。那么 "export" 有什么作用呢?

1
请观看此视频:导出变量 - 为什么需要导出BASH变量 - mfaani
3个回答

162
导出的变量,如$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
$

更多信息,请参阅GNU Bash手册中export内置命令的条目,以及命令执行环境环境部分。
请注意,未导出的变量将在通过( ... )和类似符号运行的子shell中可用,因为这些子shell是主shell的直接克隆。
$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$

子shell可以更改其自己的任何变量的副本,无论是否导出,并且可能会影响它运行的进程所看到的值,但是子shell的更改当然不能影响父shell中的变量。
关于子shell的一些信息可以在Bash手册的命令分组命令执行环境部分找到。

我添加了一些新行,也添加了只显示“$”的行,以更清楚地表明“grep”命令没有输出。当然,如果您认为这会降低可读性,请随时回滚。 - fedorqui
1
请注意,未导出的变量将在子shell中可用 - 因为它们被复制以供子shell使用。因此,在子shell中进行的任何修改都不会有影响,因为复制品在返回子shell后就会被丢弃:子shell、环境变量和作用域。环境变量也是如此:它们被复制 - 但对于任何类型的子进程,而不仅仅是子shell。因此,mysql 进程从 MYSQL_PWD 的环境变量获取值,但不会了解 MYSQL_PWD 的 shell 变量。 - David Tonhofer
1
“可供其他程序使用”== 默认情况下仅对当前进程的子进程可用。这是出于安全原因,不会开放给任何其他进程。除非它们有权限检查具有所述环境的进程(例如,以相同用户身份运行的调试器或作为root)。例如,作为root,您可以读取进程#1的环境:“cat /proc/1/environ”会返回“HOME=/TERM=linuxBOOT_IMAGE=/vmlinuz-4.19.9-300.fc29.x86_64LANG=en_GB.UTF-8”或类似内容。 - David Tonhofer

66

它使赋值对子进程可见。

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

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

21

这通常取决于所使用的shell。对于bash,它将变量标记为“可导出”,这意味着它将在您运行的任何子进程环境中显示。

未导出的变量仅在当前进程(即shell)中可见。

来自bash man页面:

export [-fn] [name[=word]] ...
export -p

提供的变量名被标记为自动导出到后续执行的命令的环境中。

如果给出了-f选项,则名称是指函数。 如果未给出名称或提供-p选项,则会打印出在此shell中导出的所有名称的列表。

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

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

export返回退出状态为0,除非遇到无效选项、其中一个名称不是有效的shell变量名称,或-f与不是函数的名称一起使用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接