协慌网

登录 贡献 社区

定义带或不带导出的变量

什么是export

有什么区别:

export name=value

name=value

答案

export使变量可用于子流程。

那是,

export name=value

表示变量名称可用于从该 shell 进程运行的任何进程。如果您希望进程使用此变量,请使用export ,并从该 shell 运行该进程。

name=value

表示变量作用域仅限于 shell,并且不可用于任何其他进程。您可以将此用于(例如)循环变量,临时变量等。

重要的是要注意,导出变量不会使父进程可用。也就是说,在生成的进程中指定和导出变量不会使其在启动它的过程中可用。

为了说明其他答案所说的内容:

$ foo="Hello, World"
$ echo $foo
Hello, World
$ bar="Goodbye"
$ export foo
$ bash
bash-3.2$ echo $foo
Hello, World
bash-3.2$ echo $bar

bash-3.2$

其他人已经回答说,导出使变量可用于子壳,这是正确的,但仅仅是副作用。导出变量时,它会将该变量放在当前 shell 的环境中(即 shell 调用 putenv(3)或 setenv(3))。进程的环境在 exec 中继承,使变量在子 shell 中可见。

编辑(5 年的观点):这是一个愚蠢的答案。 “导出” 的目的是使变量 “处于随后执行的命令的环境中”,无论这些命令是子单元还是子进程。一个简单的实现是简单地将变量放在 shell 的环境中,但这将导致无法实现export -p