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

Joh*_*hir 110 bash shell zsh

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

Jon*_*ler 128

导出的变量,如$HOME$PATH可用于(通过继承)由它们导出的外壳(和那些其他程序运行的程序,等等)作为环境变量运行其他程序.常规(非导出)变量不可用于其他程序.

$ 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
$
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅GNU Bash手册中export内置条目,以及命令执行环境环境部分.

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

$ othervar=present
$ (echo $othervar; echo $variable; variable=elephant; echo $variable)
present
Hello
elephant
$ echo $variable
Hello
$
Run Code Online (Sandbox Code Playgroud)

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

有关子shell的一些信息可以在Bash手册中的命令分组命令执行环境下找到.


jco*_*ctx 55

它使赋值对子进程可见.

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
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 18

嗯,它通常取决于shell.因为bash,它将变量标记为"可导出",这意味着它将显示在您运行的任何子进程的环境中.

非导出变量仅在当前进程(shell)中可见.

bash手册页:

export [-fn] [name[=word]] ...
export -p

提供的名称标记为自动导出到随后执行的命令的环境.

如果-f给出了该选项,则名称指的是函数.如果未给出名称,或者-p提供了该选项,则会打印在此shell中导出的所有名称的列表.

-n选项导致从每个名称中删除导出属性.

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

export返回退出状态为0,除非遇到无效选项,其中一个名称不是有效的shell变量名称,或者-f提供的名称不是函数.

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