bash中“ a = b”和“导出a = b”之间的区别


Answers:


54

export 将变量传播到子流程。

例如,如果您做了

FOO=bar

那么检查FOO的子流程将找不到该变量,而

export FOO=bar

将允许子进程找到它。

但是,如果FOO已经被定义为一个环境变量,然后FOO=bar将修改环境变量的值。

例如:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

较旧的shell不支持该export FOO=bar语法。你必须写FOO=bar; export FOO


33
实际上,如果您不使用“ export”,则不是在定义环境变量,而只是在定义shell变量。Shell变量仅可用于Shell进程;环境变量可用于任何后续过程,而不仅仅是shell。另外,子外壳程序是括号中包含的命令,它们确实可以访问外壳程序变量,而您所谈论的是恰好是外壳程序的子进程。
wfaulk

这些存放在哪里?
HDave

28

如果不使用export,则不会定义环境变量。只是一个shell变量。

Shell变量仅可用于Shell进程;环境变量可用于任何后续过程,而不仅仅是shell。


2

另外,如果您希望变量可用于调用外壳程序而不使用导出,则可以执行以下操作:

文件a.ksh是-

#!/bin/ksh
FOO=bar

在提示符下,运行

> . a.ksh

这将在同一外壳中运行命令,并且$ FOO将可用。

鉴于,

> a.ksh

将使$ FOO仅在a.ksh内可用,对a.ksh的调用将不存在。


1
正确。注意 ”。” 只是“源”的快捷方式,有时在脚本中使用它可以提高可读性。请参阅“帮助”。或“帮助来源”以获取详细信息。
sleske '02

1

除了已经回答的内容外,这两个语句都不一定定义(即,创建还是设置)环境变量,因为“ a”可能已经作为外壳或环境变量存在。

在后一种情况下,这两个语句严格相等。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.