出口是干什么用的?

有什么区别:

export name=value

and

name=value

当前回答

默认情况下,在脚本中创建的变量只对当前shell可用;子进程(子shell)将不能访问已设置或修改的值。允许子进程查看这些值,需要使用export命令。

其他回答

有人说在生成子shell时不需要在bash中导出,而其他人则说完全相反。注意子shell(由()、' '、$()或循环创建的子shell)和子进程(按名称调用的进程,例如脚本中出现的bash文本)之间的区别是很重要的。

子shell将可以访问来自父变量的所有变量,而不管它们的导出状态如何。 子进程只能看到导出的变量。

这两种构造的共同之处在于它们都不能将变量传递回父shell。

$ noexport=noexport; export export=export; (echo subshell: $noexport $export; subshell=subshell); bash -c 'echo subprocess: $noexport $export; subprocess=subprocess'; echo parent: $subshell $subprocess
subshell: noexport export
subprocess: export
parent:

还有一个困惑的来源:一些人认为“分叉”子进程是那些看不到非导出变量的子进程。通常fork()后面紧跟着exec(),这就是为什么看起来fork()是要找的东西,而实际上是exec()。你可以先用exec命令运行没有fork()ing的命令,由这个方法启动的进程也不能访问未导出的变量:

$ noexport=noexport; export export=export; exec bash -c 'echo execd process: $noexport $export; execd=execd'; echo parent: $execd
execd process: export

注意,这次我们没有看到parent:行,因为我们已经用exec命令替换了父shell,所以没有任何东西可以执行该命令。

需要注意的是,您可以导出一个变量,然后更改其值。变量更改后的值将对子进程可用。一旦为一个变量设置了export,您必须执行export -n <var>来删除该属性。

$ K=1
$ export K
$ K=2
$ bash -c 'echo ${K-unset}'
2
$ export -n K
$ bash -c 'echo ${K-unset}'
unset

这里还有一个例子:

VARTEST="value of VARTEST" 
#export VARTEST="value of VARTEST" 
sudo env | grep -i vartest 
sudo echo ${SUDO_USER} ${SUDO_UID}:${SUDO_GID} "${VARTEST}" 
sudo bash -c 'echo ${SUDO_USER} ${SUDO_UID}:${SUDO_GID} "${VARTEST}"'  

只有使用export VARTEST,才能在sudo bash -c `…`中使用VARTEST的值!

更多的例子见:

http://mywiki.wooledge.org/SubShell bash-hackers.org/wiki/doku.php/scripting/processtree

您可能已经知道,UNIX允许进程拥有一组环境变量,这些变量是键/值对,键和值都是字符串。 操作系统负责为每个进程分别保存这些对。

程序可以通过以下UNIX API访问它的环境变量:

Char *getenv(const Char *name); Int setenv(const char *名称,const char *值,Int重写); Int unsetenv(const char *name);

进程还从父进程继承环境变量。在创建子进程时,操作系统负责创建所有“envars”的副本。

Bash和其他shell一样,能够根据用户请求设置其环境变量。这就是出口存在的意义。

export是Bash设置环境变量的命令。用这个命令设置的所有变量都将被这个Bash创建的所有进程继承。

更多关于Bash中的环境

Bash中的另一种变量是内部变量。由于Bash不仅仅是交互式shell,它实际上是一个脚本解释器,就像任何其他解释器(例如Python)一样,它能够保留自己的一组变量。值得一提的是,Bash(与Python不同)只支持字符串变量。

定义Bash变量的符号是name=value。这些变量保存在Bash内部,与操作系统保存的环境变量无关。

更多关于Shell参数(包括变量)

另外值得注意的是,根据Bash参考手册:

任何简单命令或函数的环境都可以扩充 临时用参数赋值作为前缀,如前所述 在Shell Parameters中。这些赋值语句只影响 该命令所看到的环境。


总结一下:

Export命令用于设置操作系统中的环境变量。这个变量以后将对当前Bash进程创建的所有子进程可用。 Bash变量符号(name=value)用于设置局部变量仅对当前Bash进程可用 另一个命令前缀的Bash变量表示法仅为该命令的范围创建环境变量。

虽然在讨论中没有明确提到,但从bash内部生成子shell时没有必要使用export,因为所有变量都复制到子进程中。