Bash中"export"的含义是什么?



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

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

那么,有什么区别呢?

要回答您确切的特定问题,在这个特定的案例中,没有任何差异。为什么?

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

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

来自man bash:

。。。exportdeclare -x命令允许将参数和功能添加到环境中或从环境中删除。如果修改了环境中参数的值,则新值将成为环境的一部分,替换旧值。

同样来自man bash:

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

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

导出的变量可用于其他程序。未导出的变量不是。

示例:

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

如果你想了解更多关于这方面的信息,请查看export(GNUBash手册)。

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

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

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

有关潜艇外壳的更多信息,请参考:

  • 命令分组

  • 命令执行环境

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

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

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

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

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

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

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