“导出”在shell编程中做了什么?

时间:2011-09-14 05:00:31

标签: bash shell zsh

据我所知,变量赋值是相同的,无论它是否在“export”之前。这是为了什么?

4 个答案:

答案 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 environmentenvironment上的部分。

请注意,未导出的变量可用于通过( ... )和类似符号运行的子shell,因为这些子shell是主shell的直接克隆:

$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$

子shell可以更改自己的任何变量的副本,无论是否已导出,并且可能会影响它运行的进程所看到的值,但子shell的更改当然不会影响父shell中的变量。

有关子广告的一些信息可以在Bash手册的command groupingcommand 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选项会导致从每个名称中删除导出属性。

     

如果变量名后跟=word,则变量的值设置为word

     除非遇到无效选项,其中一个名称不是有效的shell变量名称,或者export提供的名称不是函数,否则

-f将返回退出状态0。

您还可以使用typeset命令将变量设置为可导出,并使用set -a自动标记所有未来的变量创建或修改。

答案 3 :(得分:-2)

导出变量可用于流程层次结构中的所有流程。例如,子进程导出的数据可用于父进程,反之亦然。

导出的主要用例是在两个进程之间共享数据。