【问题标题】:What is the meaning of "export" in Bash? [duplicate]Bash 中的“导出”是什么意思? [复制]
【发布时间】:2015-06-25 01:10:03
【问题描述】:

当我自定义我的环境时,我在文件 .bash_profile 中添加了PATH=$PATH:$My-own-Path

教程告诉我应该使用这个:export PATH=$PATH:$My-own-Path

那么,有什么区别呢?

【问题讨论】:

  • @MichaelBurr 根据帖子的标题,我同意它是重复的。但更具体地说,OP 询问明确使用 export 和不使用它有什么区别。事实上,在大多数情况下不会有任何区别。已经这样回答了。

标签: bash cmd export command-line-interface


【解决方案1】:

export 使环境变量可用于子进程

【讨论】:

  • 你能详细说明一下吗?例如,这样做的实际结果是什么?请通过editing your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。
【解决方案2】:

来自man bash

...exportdeclare -x 命令允许在环境中添加和删除参数和函数。如果环境中某个参数的值被修改,新的值将成为环境的一部分,取代旧的。

同样来自man bash

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

提供的名称被标记为自动导出到随后执行的命令的环境中。如果给出了-f 选项,则名称指的是函数。如果没有给出名称,或者如果提供了-p 选项,则会打印所有导出变量的名称列表。 -n 选项导致从每个名称中删除导出属性。如果变量名后跟=word,则变量的值设置为word。 export 返回退出状态 0,除非遇到无效选项,名称之一不是有效的 shell 变量名称,或者 -f 提供的名称不是函数。

【讨论】:

  • 那么有什么区别呢?可以加个结论吗?但是没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的。
【解决方案3】:

导出的变量可供其他程序使用。非导出变量不是。

例子:

$ myVar=Foo             # Create local
$ env | grep '^myVar='
$ export myVar          # Export myVar to child process
$ env | grep '^myVar='
Foo

如果您想了解更多相关信息,请查看export(GNU Bash 手册)。

另外,请注意,未导出的变量将可用于使用(...) 和其他类似符号运行的子shell:

$ thereVar=Bar
$ (echo $thereVar; echo $myVar; $myVar=testing; echo $myVar)
Bar
Foo
Testing
$echo $myVar
Foo

子shell不能影响父shell中的变量。

有关子shell的更多信息,请参考:

【讨论】:

  • 导出的变量可用于其他程序 我认为应该是合格的。环境块被复制到子进程(默认情况下),它不是共享的,对任何旧进程都不可见。
  • 感谢指正!
  • 第二个链接断了一半 - 锚点“#Command-Grouping”不存在。
【解决方案4】:

要回答您确切的具体问题,在这种特殊情况 中,没有任何 区别。为什么?

在初始化过程的某个地方,变量PATH 已经被导出。已经导出的变量值的更改不需要另一个export;这是自动的。此后触发的进程将获得新值。

【讨论】:

  • 通常是的,尤其是.bash_profile。但是假设设置了环境块有时被视为安全风险。如果有人使用env -i 运行您的脚本怎么办?
  • @cdarke OP 正在询问.bash_profile。这个答案特别强调了这个特殊的案例。如果“某人”用env -i 运行我的.bash_profile,我认为没有任何风险。如果您有安全风险的具体示例或在此上下文中存在任何其他重大问题,请告知我们。
【解决方案5】:

每个进程都有一个称为环境块的内存区域。在环境块中是环境变量。这些看起来像普通变量,例如x=42

在大多数 shell(C shell 是一个例外)中,您使用 export 将普通变量移动到环境块中。该命令还可以创建环境变量而无需经过中间阶段。如果变量已经在环境块中,那么export 将无效。

那为什么?创建新进程时,默认操作是将各种“核心信息”从父进程复制到子进程。其中包括当前目录、umask、文件描述符表、uid 和 gid 以及环境块

请注意,子级仅获得父级环境块的副本。该变量不共享,不能传回父级(除非使用其他一些进程间通信机制)。

您可以使用env 程序覆盖此默认行为,但这很少需要。

因此,如果我们在 shell 脚本中使用 export 设置环境变量,那么我们创建的所有子进程,当我们调用其他程序时,都会获得它们的副本。一些变量名是众所周知的并且具有特殊含义,而PATH 环境变量可能是其中最重要的。

PATH 环境变量用于在 UNIX/Linux 上查找程序。每次我们需要加载程序时,都会按左右顺序搜索 PATH 中的目录。 Bash 还在 hash 中缓存可执行路径(KornShell 称它们为“跟踪别名”)。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2012-04-19
    • 2021-02-11
    • 2017-03-18
    • 2021-05-04
    • 2013-08-08
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    相关资源
    最近更新 更多