导出在 BASH 中做什么?

Cha*_*ens 122 bash export shell-script

可能的重复:
bash 中“a=b”和“export a=b”之间的区别

很难承认,但我从来没有真正理解export过环境变量究竟做了什么。我知道如果我不导出变量,我有时在子进程中看不到它,但有时似乎可以。当我说的时候到底发生了什么

export foo=5
Run Code Online (Sandbox Code Playgroud)

什么时候不应该导出变量?

Pyl*_*lsa 162

导出的变量会传递给子进程,而非导出的变量则不会。

  • 您可以通过向路径添加一些内容(比如`PYTHONPATH`)来验证这一点,然后注意虽然你可以`echo $PYTHONPATH` 它不会被python或bash脚本识别,直到你`export`它 (4认同)
  • @JepZ 我认为你给出的例子不适用。这些是不是子进程的 shell 内置命令 `echo` 或发生在同一个 shell 中的 shell 扩展的示例。 (2认同)

小智 28

当您使用 时export,您将变量添加到调用 export 命令的 shell 的环境变量列表中,并且 shell 的所有环境变量都传递给子进程,这就是您可以使用它的原因。

当你完成 shell 时,它的环境被破坏了,这就是为什么在登录时声明和导出环境变量的原因,例如在 .bashrc 文件中


sml*_*sml 16

来自man bash

环境

当一个程序被调用时,它被赋予一个称为环境的字符串数组。这是名称-值对的列表,形式为名称=值。

shell 提供了几种操作环境的方法。在调用时,shell 会扫描自己的环境并为找到的每个名称创建一个参数,自动将其标记为导出到子进程。执行的命令继承环境。的exportdeclare -x 命令允许参数和功能被添加到和来自环境的删除。如果环境中的参数值被修改,新值将成为环境的一部分,取代旧值。任何执行命令继承的环境包括 shell 的初始环境,其值可以在 shell 中修改,减去unset 命令删除的任何对,加上通过导出和declare -x命令的任何添加 。

  • 恕我直言,在没有任何额外解释的情况下复制粘贴文档摘录不应该被赞成。 (129认同)
  • 这段摘录不是很清楚,坦率地说,我不明白发生了什么。 (58认同)
  • @Artur:相反:如果(摘自)文档回答了一个问题,我宁愿没有额外的解释。 (9认同)
  • 我相信 Artur 和 Trismegistos 提出的观点是任何人都可以复制粘贴,这并不总是足够的,澄清并提供一个好的答案。复制粘贴一些文档或提供链接是可以的,实际上是鼓励的,但应该有一些额外的质量解释。此外,如果 RenéNyffenegger 这样的人不需要它,那么这种解释很容易被忽略,但它会为那些将从中受益的人提供。我们都在努力学习,并以不同的方式获得理解,这有助于涵盖各种学习风格,并会提高您的评分。 (8认同)
  • @RenéNyffenegger 但似乎没有。至少,直到我阅读了 BloodPhilia 的答案时我才明白,该答案应标记为已接受。 (6认同)
  • 我上面的评论比 sml 提供的答案花费了更多的时间和精力,目前该答案已被 OP 标记为接受。这是需要考虑的另一点。 (3认同)