“export”命令是做什么用的?

92

我有时候会盲目地运行一些命令,以便完成任务。

最近我开始使用Jenkins,然后我不得不使用这个export命令来运行Jenkins WAR archive。一般情况下,export命令是用来做什么的?为什么要在设置好Jenkins home之后再运行这个命令来运行Jenkins?


1
如果您提供更多关于您使用的导出命令的上下文信息,那将会很有帮助。没有更多的上下文信息,我猜测您正在设置一个环境变量。请参阅http://en.wikipedia.org/wiki/Environment_variable#Unix。 - Joshua D. Boyd
可能是Unix导出命令的重复问题。 - John Kugelman
3个回答

104
sh和相关的shell(如Bash)中,export命令会将一个环境变量标记为要被“导出”到子进程中,以便子进程可以继承它们。
在POSIX标准中定义了export链接 引用如下:
"The shell shall give the export attribute to the variables corresponding to the specified names, which shall cause them to be in the environment of subsequently executed commands. If the name of a variable is followed by = word, then the value of that variable shall be set to word."

4
在这个意义上,“子进程”是什么? - RomanKousta

33

我猜你来自Windows背景。所以我会对它们进行对比(我对Linux也比较新)。我发现一个用户对我的评论的回复,在弄清楚事情方面非常有用。

在Windows中,变量可以是永久的或者不是。术语环境变量包括使用SET命令在cmd shell中设置的变量,以及当变量在Windows GUI中设置时,在注册表中设置并在新的cmd窗口中可见。

例如,在Windows中, set命令的文档“显示、设置或删除环境变量。如果不带参数,则显示当前的环境设置。”

在Linux中,set不会显示环境变量。它显示shell变量,而不将其称为环境变量。此外,Linux不使用set设置变量(除了位置参数和shell选项之外,在结尾处作为注释解释),只用于显示它们,即使是只显示shell变量。Windows用set设置和显示,例如set a=5,但Linux不这样做。

在Linux中,我想你可以编写一个脚本,在启动时设置变量,例如/etc/profile/etc/.bashrc,但除此之外,它们不是永久的。它们存储在RAM中。
在Linux中,有一个区别,即shell变量和环境变量。在Linux中,shell变量仅存在于当前shell中,而环境变量存在于该shell及其所有子shell中。
您可以使用set命令查看shell变量(请注意,与Windows不同,Linux中不使用set命令设置变量)。 set -o posix; set(首先执行set -o posix可以避免显示太多不必要的内容)。因此,set显示shell变量。
您可以使用env命令查看环境变量。
使用a = 5即可设置Shell变量。
使用export可以设置环境变量。Export还设置了shell变量。

在这里,您可以看到使用zzz = 5设置的shell变量zzz,并且在运行set时显示出来,但它不会显示为环境变量。

在这里,我们看到使用export设置的yyy是一个环境变量。并且可以看到它在shell变量和环境变量下都显示出来:

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

其他有用的问答:

注意:有一点需要补充并且对我所写的进行了一些修正,在Linux bash中,'set'可以用于设置“位置参数”和“shell选项/属性”,在技术上这两者都是变量,尽管man pages可能没有将它们描述为变量。
但是,如前所述,set不会设置shell变量或环境变量。如果你输入set asdf,则会将$1设置为asdf,如果你输入echo $1,则会看到asdf。
如果你输入set a=5,它不会将变量a设置为5。它将位置参数$1设置为字符串"a=5"。因此,如果你在Linux中看到set a=5,除非有人真的想要那个字符串a=5在$1中,否则它很可能是一个错误。
Linux的set还可以设置shell选项/属性。如果您执行set -o,您会看到它们的列表。例如,您可以执行set -o verbose以打开详细模式(默认情况下关闭,但这对此无影响)。或者您可以执行set +o verbose以关闭详细模式。Windows没有这样的用法来使用其set命令。

看起来 set 显示 shell 和环境,而 'env' 只显示环境。 - barlop
1
我非常喜欢这个答案,因为它涵盖了最初可能令人困惑的nix与win情况。 - N0thing

9
简单来说,环境变量是在打开新的 shell 会话时设置的。如果您随时更改任何变量值,则 shell 无法选择该更改。这意味着您所做的更改仅在新的 shell 会话中生效。
另一方面,export 命令提供了更新当前 shell 会话有关导出变量更改的能力。您不必等待新的 shell 会话即可使用您更改的变量的值。

3
如果我说 a=5 然后 echo $a,它会显示 5。但是你写道:“任何时候如果您更改任何变量值,shell 都无法检测到这种更改。这意味着您所做的更改在新的 shell 会话中生效。”那么它是如何更新 shell 会话而不使用 export 呢?您能举一个需要使用 export 的例子吗?当您在当前 shell 会话中设置变量时,该变量仅在该会话中可用,而无法在其他 shell 会话或子进程中使用。但是,在同一 shell 会话中,您可以使用该变量并对其进行更改。例如,如果您在终端中打开一个 shell,设置变量 a=5,然后运行脚本文件,该脚本文件将能够使用变量 a 并显示其值为 5。export 命令用于使变量在当前 shell 会话之外可用,以便其他 shell 会话或子进程也可以使用该变量。例如,如果您想要将变量 a 导出到新的 shell 会话中,则可以使用命令 export a。在新的 shell 会话中,您可以使用变量 a 并查看其值为 5。因此,如果您希望将变量导出到其他 shell 会话或子进程中使用,则需要使用 export 命令。 - barlop
在shell会话期间设置的变量是shell变量。它是本地的并且可以被当前的shell会话访问。你可以随时更改它,而它的当前值将在当前shell进程中可用,无需导出更改。另一方面,环境变量是在登录时设置的。当你更改它们的任何值时,你需要执行一个简单的刷新操作,使新值对当前shell进程和任何新的子进程都可用。这正是导出所做的事情。 - katwekibs
即使我们更改了在登录时设置的环境变量,它也会立即更改。 - Jamāl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接