出口是干什么用的?

有什么区别:

export name=value

and

name=value

当前回答

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命令。

需要注意的是,您可以导出一个变量,然后更改其值。变量更改后的值将对子进程可用。一旦为一个变量设置了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

只是为了显示环境中导出的变量(env)和环境中未导出的变量之间的区别:

如果我这样做:

$ MYNAME=Fred
$ export OURNAME=Jim

那么只有$OURNAME出现在环境中。变量$MYNAME不在环境中。

$ env | grep NAME
OURNAME=Jim

但是变量$MYNAME在shell中确实存在

$ echo $MYNAME
Fred

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

UNIX的两位创建者Brian Kernighan和Rob Pike在他们的书《UNIX编程环境》中解释了这一点。谷歌的标题,你会很容易找到一个pdf版本。

它们介绍了3.6节中的shell变量,并重点介绍了该节末尾的export命令的使用:

当您想要在子shell中访问变量的值时,应该使用shell的export命令。(您可能会想为什么没有办法将变量的值从子shell导出到父shell)。