出口是干什么用的?
有什么区别:
export name=value
and
name=value
出口是干什么用的?
有什么区别:
export name=value
and
name=value
当前回答
这里还有一个例子:
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
其他回答
这个答案是错误的,但出于历史目的保留了下来。请看下面的第二篇编辑。
其他人回答说,导出使变量可用于子shell,这是正确的,但只是一个副作用。当你导出一个变量时,它把这个变量放在当前shell的环境中(即shell调用putenv(3)或setenv(3))。 进程的环境通过exec继承,使得变量在子shell中可见。
编辑(5年视角): 这是一个愚蠢的回答。“导出”的目的是使变量“处于随后执行的命令的环境中”,无论这些命令是子shell还是子进程。简单的实现是简单地将变量放在shell环境中,但这将使无法实现export -p。
第二次编辑(又过了5年)。 这个答案很奇怪。也许我曾经有一些理由声称bash将导出的变量放到它自己的环境中,但是这些理由在这里没有给出,现在已经被历史遗忘了。请参见将函数局部变量导出到环境。
有人说在生成子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,所以没有任何东西可以执行该命令。
只是为了显示环境中导出的变量(env)和环境中未导出的变量之间的区别:
如果我这样做:
$ MYNAME=Fred
$ export OURNAME=Jim
那么只有$OURNAME出现在环境中。变量$MYNAME不在环境中。
$ env | grep NAME
OURNAME=Jim
但是变量$MYNAME在shell中确实存在
$ echo $MYNAME
Fred
Export将使该变量对当前shell派生的所有shell可用。
默认情况下,在脚本中创建的变量只对当前shell可用;子进程(子shell)将不能访问已设置或修改的值。允许子进程查看这些值,需要使用export命令。