出口在BASH中做什么?[重复]


74

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

很难承认,但是我从来没有真正理解export过环境变量到底能做什么。我知道,如果不导出变量,有时在子进程中看不到该变量,但有时似乎可以。我说的时候到底是怎么回事

export foo=5

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


这里是至少一个与此主题有关的有用问题的链接:superuser.com/questions/143413/linux-environment-variables ...因为具有讽刺意味的是,这个问题是第一个在Google上弹出的关于bash导出查询的问题。
Ogre Psalm33 2011年


一种常见的用法是将export语句添加到.bashrc / .bash_profile中,以创建类似于的持久性全局变量$HOME
Evan Plaice

小心一点,这个故事比最初出现的更多。我邀请您检查我的答案。
jasonleonhard

Answers:


15

来自man bash

环境

调用程序时,将为其提供一个称为环境的字符串数组。这是名称-值对的列表,格式为name = value。

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


72
恕我直言,复制粘贴摘录的文档,而无需任何额外的解释工作,不应该被推翻。
阿图尔

29
那个摘录不是很清楚,坦白说我不明白发生了什么。
Trismegistos 2014年

4
@Artur:相反:如果(摘录自)文档回答了一个问题,我宁愿没有其他解释。
勒内Nyffenegger

1
@RenéNyffenegger,但事实并非如此。至少,直到读完BloodPhilia的回答才知道,我应将其标记为已接受。
Vladislav Rastrusny 2014年

1
我相信Artur和Trismegistos提出的观点是任何人都可以复制粘贴,但并非总是如此,请澄清并提供一个好的答案。复制粘贴某些文档或提供链接是可以的,实际上是鼓励这样做的,但是应该有一些附加的质量说明。此外,如果像RenéNyffenegger这样的人不需要的话,很容易就可以忽略不计,但是对于那些从中受益的人们来说,它将是存在的。我们都在尝试学习,并以不同的方式获得理解,这有助于涵盖各种学习方式,并会提高您的评分。
jasonleonhard

98

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


您能否指出任何有此影响的文档。我正在寻找更多的信息。例如,做一个变量只需要一次出口,或者你需要它每次更改后出口等
查斯。Owens 2010年


3
您可以通过在路径中添加一些内容(例如到PYTHONPATH)来验证这一点,然后注意,尽管可以,但是echo $PYTHONPATH直到您将export其识别后,它才能被python或bash脚本识别
Kaushik Ghose 2014年

这个答案似乎也不是完全正确的。例如,Bash子shell用于子进程(根据$BASHPID),但是您仍可以从父shell读取未导出的变量。简单证明:x="y"; echo "$BASHPID: $x"; (echo "$BASHPID: $x") 我的猜测是,这是一种特殊情况,它在子进程是子外壳程序时发生。
JepZ

20

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

完成外壳程序后,其环境被破坏,这就是为什么在登录时声明并导出环境变量的原因,例如在.bashrc文件中

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.