出口是干什么用的?
有什么区别:
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
其他回答
虽然在讨论中没有明确提到,但从bash内部生成子shell时没有必要使用export,因为所有变量都复制到子进程中。
这里还有一个例子:
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
导出使子流程可以使用该变量。
也就是说,
export name=value
意味着该变量名可用于从该shell进程运行的任何进程。如果您希望进程使用此变量,请使用export,并从该shell运行该进程。
name=value
意味着变量范围被限制在shell中,并且对任何其他进程都不可用。你可以将它用于(比如说)循环变量、临时变量等。
需要注意的是,导出变量并不会使它对父进程可用。也就是说,在派生的进程中指定和导出一个变量并不会使它在启动它的进程中可用。
export NAME=对子进程有意义的设置和变量的值。
NAME=当前shell进程私有的临时变量或循环变量的值。
更详细地说,export标记了环境中的变量名,该变量名在创建时复制到子流程及其子流程。从不从子进程复制任何名称或值。
A common error is to place a space around the equal sign: $ export FOO = "bar" bash: export: `=': not a valid identifier Only the exported variable (B) is seen by the subprocess: $ A="Alice"; export B="Bob"; echo "echo A is \$A. B is \$B" | bash A is . B is Bob Changes in the subprocess do not change the main shell: $ export B="Bob"; echo 'B="Banana"' | bash; echo $B Bob Variables marked for export have values copied when the subprocess is created: $ export B="Bob"; echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash & [1] 3306 $ B="Banana"; echo '(sleep 30; echo "Subprocess 2 has B=$B")' | bash Subprocess 1 has B=Bob Subprocess 2 has B=Banana [1]+ Done echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash Only exported variables become part of the environment (man environ): $ ALICE="Alice"; export BOB="Bob"; env | grep "ALICE\|BOB" BOB=Bob
所以,现在它应该像夏天的太阳一样清晰了!感谢Brain Agnew, alexp和William Prusell。
默认情况下,在脚本中创建的变量只对当前shell可用;子进程(子shell)将不能访问已设置或修改的值。允许子进程查看这些值,需要使用export命令。