当我自定义我的环境时,我在文件.bash_profile.中添加PATH=$PATH:$My-own-Path
教程告诉我应该使用这个:export PATH=$PATH:$My-own-Path
那么,有什么区别呢?
要回答您确切的特定问题,在这个特定的案例中,没有任何差异。为什么?
在初始化过程的某个地方,变量PATH
已经导出。已经导出的变量值的更改不需要另一个export
;这是自动的。此后启动的进程将获得新的值。
export
使环境变量可用于子进程
来自man bash
:
。。。
export
和declare -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称之为"跟踪别名")。