出口是干什么用的?
有什么区别:
export name=value
and
name=value
出口是干什么用的?
有什么区别:
export name=value
and
name=value
当前回答
您可能已经知道,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变量表示法仅为该命令的范围创建环境变量。
其他回答
这里还有一个例子:
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)将不能访问已设置或修改的值。允许子进程查看这些值,需要使用export命令。
这个答案是错误的,但出于历史目的保留了下来。请看下面的第二篇编辑。
其他人回答说,导出使变量可用于子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)。
您可能已经知道,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变量表示法仅为该命令的范围创建环境变量。