“导出”命令有啥作用?
Posted
技术标签:
【中文标题】“导出”命令有啥作用?【英文标题】:What does the 'export' command do?“导出”命令有什么作用? 【发布时间】:2012-11-27 12:41:57 【问题描述】:为了完成任务,我碰巧盲目地运行了一些命令。
我最近开始使用Jenkins,然后我不得不使用这个export
命令来运行Jenkins WAR archive。 export
命令一般有什么作用,为什么我们需要在运行 Jenkins 时运行此命令(在设置 Jenkins 主页之后)?
【问题讨论】:
如果您能详细说明您使用的导出命令,将会有所帮助。如果没有更多上下文,我猜您正在设置环境变量。见en.wikipedia.org/wiki/Environment_variable#Unix bash: defining a variable with or without export的可能重复 unix export command的可能重复 【参考方案1】:export
在sh
和相关的 shell(例如 Bash)中,将环境变量标记为导出到子进程,以便子进程继承它们。
export
is defined in POSIX:
shell 应将导出属性赋予与指定名称对应的变量,这将使它们处于随后执行的命令的环境中。如果变量名后跟=word,则该变量的值应设置为word。
【讨论】:
这个意义上的子进程是什么?【参考方案2】:简单来说,环境变量是在您打开一个新的 shell 会话时设置的。在任何时候,如果您更改任何变量值,shell 都无法选择该更改。这意味着您所做的更改会在新的 shell 会话中生效。
另一方面,export
命令提供了根据您对导出变量所做的更改更新当前 shell 会话的能力。您不必等到新的 shell 会话才能使用您更改的变量的值。
【讨论】:
但是如果我说a=5
然后echo $a
然后它说5。然而你写了“在任何时候如果你改变任何变量值,shell 都没有办法选择那个改变。这意味着您所做的更改在新的 shell 会话中生效。"。
您在 shell 会话期间设置的变量是 shell 变量。它是本地的并且可供当前 shell 会话访问。您可以随时更改它,其当前值将可用于当前 shell 进程,而无需导出更改。另一方面,环境变量是在登录时设置的。当您更改它们的任何值时,您需要执行简单的刷新操作,使新值可用于当前 shell 进程和任何新的子进程。这正是 export 的作用。【参考方案3】:
我猜你来自 Windows 背景。所以我将对比它们(我对 Linux 也很陌生)。我发现一个用户对我的评论的回复,对弄清楚事情很有用。
在 Windows 中,变量可以是永久的,也可以不是。 环境变量一词包括在 cmd shell 中使用 SET 命令设置的变量,以及当变量在 Windows GUI 中设置时,因此在注册表中设置时,并在新的 cmd 窗口中可见。
例如,the documentation for the set command in 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
命令查看环境变量。
Shell 变量设置为例如 a = 5
。
环境变量用export设置。导出还设置了 shell 变量。
这里你看到用zzz = 5
设置的shell变量zzz,运行set
时看到它显示,但它没有显示为环境变量。
这里我们看到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
$
其他有用的 QnAs:
https://unix.stackexchange.com/questions/176001/how-can-i-list-all-shell-variables
https://askubuntu.com/questions/26318/environment-variable-vs-shell-variable-whats-the-difference
注意:有一点需要详细说明并且对我所写的内容有所纠正,那就是,在 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
, off 来打开详细信息(顺便说一下,默认值恰好是关闭的,但这对此没有影响)。或者您可以通过set +o verbose
关闭详细信息。 Windows 的 set 命令没有这种用法。
【讨论】:
看起来 set 显示 shell 和环境,而 'env' 只显示环境 非常喜欢这个答案,因为它涵盖了 nix 与 win 的案例,一开始可能会令人困惑。以上是关于“导出”命令有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章