出口是干什么用的?
有什么区别:
export name=value
and
name=value
出口是干什么用的?
有什么区别:
export name=value
and
name=value
当前回答
默认情况下,在脚本中创建的变量只对当前shell可用;子进程(子shell)将不能访问已设置或修改的值。允许子进程查看这些值,需要使用export命令。
其他回答
虽然在讨论中没有明确提到,但从bash内部生成子shell时没有必要使用export,因为所有变量都复制到子进程中。
公认的答案暗示了这一点,但我想明确地说明与shell内置的连接:
如前所述,export将使一个变量对shell和子程序都可用。如果不使用export,该变量将只在shell中可用,并且只有shell内置程序可以访问它。
也就是说,
tango=3
env | grep tango # prints nothing, since env is a child process
set | grep tango # prints tango=3 - "type set" shows `set` is a shell builtin
这个答案是错误的,但出于历史目的保留了下来。请看下面的第二篇编辑。
其他人回答说,导出使变量可用于子shell,这是正确的,但只是一个副作用。当你导出一个变量时,它把这个变量放在当前shell的环境中(即shell调用putenv(3)或setenv(3))。 进程的环境通过exec继承,使得变量在子shell中可见。
编辑(5年视角): 这是一个愚蠢的回答。“导出”的目的是使变量“处于随后执行的命令的环境中”,无论这些命令是子shell还是子进程。简单的实现是简单地将变量放在shell环境中,但这将使无法实现export -p。
第二次编辑(又过了5年)。 这个答案很奇怪。也许我曾经有一些理由声称bash将导出的变量放到它自己的环境中,但是这些理由在这里没有给出,现在已经被历史遗忘了。请参见将函数局部变量导出到环境。
UNIX的两位创建者Brian Kernighan和Rob Pike在他们的书《UNIX编程环境》中解释了这一点。谷歌的标题,你会很容易找到一个pdf版本。
它们介绍了3.6节中的shell变量,并重点介绍了该节末尾的export命令的使用:
当您想要在子shell中访问变量的值时,应该使用shell的export命令。(您可能会想为什么没有办法将变量的值从子shell导出到父shell)。
只是为了显示环境中导出的变量(env)和环境中未导出的变量之间的区别:
如果我这样做:
$ MYNAME=Fred
$ export OURNAME=Jim
那么只有$OURNAME出现在环境中。变量$MYNAME不在环境中。
$ env | grep NAME
OURNAME=Jim
但是变量$MYNAME在shell中确实存在
$ echo $MYNAME
Fred