据我所知,变量赋值是相同的,无论它是否在“export”之前。这是为了什么?
答案 0 :(得分:120)
$HOME
和$PATH
等导出变量可用于(由其继承)由其导出的shell运行的其他程序(以及由其他程序运行的程序,等等)作为环境变量。常规(非导出)变量不可用于其他程序。
$ env | grep '^variable='
$ # No environment variable called variable
$ variable=Hello # Create local (non-exported) variable with value
$ env | grep '^variable='
$ # Still no environment variable called variable
$ export variable # Mark variable for export to child processes
$ env | grep '^variable='
variable=Hello
$
$ export other_variable=Goodbye # create and initialize exported variable
$ env | grep '^other_variable='
other_variable=Goodbye
$
有关详细信息,请参阅GNU Bash手册中export
builtin的条目,以及command execution environment和environment上的部分。
请注意,未导出的变量可用于通过( ... )
和类似符号运行的子shell,因为这些子shell是主shell的直接克隆:
$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$
子shell可以更改自己的任何变量的副本,无论是否已导出,并且可能会影响它运行的进程所看到的值,但子shell的更改当然不会影响父shell中的变量。
有关子广告的一些信息可以在Bash手册的command grouping和command execution environment下找到。
答案 1 :(得分:53)
它使赋值对子进程可见。
jcomeau@intrepid:~/rentacoder/bin2txt$ foo=bar
jcomeau@intrepid:~/rentacoder/bin2txt$ bash -c 'echo $foo'
jcomeau@intrepid:~/rentacoder/bin2txt$ export foo
jcomeau@intrepid:~/rentacoder/bin2txt$ bash -c 'echo $foo'
bar
答案 2 :(得分:16)
嗯,它通常取决于shell。对于bash
,它将变量标记为“可导出”,这意味着它将显示在您运行的任何子进程的环境中。
非导出变量只能从当前进程(shell)中看到。
来自bash
手册页:
<强>
export [-fn] [name[=word]] ...
强>
的export -p
强>
提供的名称标记为自动导出到后续执行的命令的环境。
如果给出了
-f
选项,则名称指的是函数。如果没有给出名称,或者提供了-p
选项,则会打印在此shell中导出的所有名称的列表。
-n
选项会导致从每个名称中删除导出属性。如果变量名后跟
除非遇到无效选项,其中一个名称不是有效的shell变量名称,或者=word
,则变量的值设置为word
。export
提供的名称不是函数,否则
-f
将返回退出状态0。
您还可以使用typeset
命令将变量设置为可导出,并使用set -a
自动标记所有未来的变量创建或修改。
答案 3 :(得分:-2)
导出变量可用于流程层次结构中的所有流程。例如,子进程导出的数据可用于父进程,反之亦然。
导出的主要用例是在两个进程之间共享数据。