设置 PATH 与在 ~/.bash_profile 中导出 PATH

设置 PATH 与在 ~/.bash_profile 中导出 PATH

自定义 bash 配置文件时有什么区别以及哪个更好?有关该命令的文档export很少,因为它是内置命令。

摘自我的 ~/.bash_profile 版本 1:

#PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin

#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH

输出来自:echo $PATH /usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/njboot/bin

版本 2 摘录:

#PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin

#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH

输出echo $PATH与版本 1 相同。env也相同。

所以:

  • export1)使用PATH 与显式设置 PATH 相比有什么好处?
  • 2)版本1和版本2在应用时有功能上的区别吗?
  • 3)我应该使用哪个,为什么?

答案1

具体回答你的问题:

  1. export 明确设置$PATH

  2. No.export为子进程设置环境,但$PATH已经为当前环境设置。因此,在第二个示例中,当读入命令时 - 并且 export被执行 - 当前环境的值$PATH被扩展为$PATH单词。

  3. 您应该使用您认为必要和/或舒适的任何一种。两者在功能上都没有任何区别,所以这主要是风格问题。

POSIX 定义了export内置所以:

shell 应将export属性赋予与指定名称相对应的变量,这将使它们处于随后执行的命令的环境中。如果变量名后面跟着= 字,那么该变量的值应设置为单词

来自我的另一个答案:

声明 shell 变量和环境变量之间没有什么区别。因为导出是一个内置函数,所以它为下一个调用的进程声明一个环境变量,但如果您不调用该进程,该进程仍然是 shell,因此您的变量将被计算两次。

只要您不使用export两次评估,您就可以删除所有导出,而不会对导出的变量产生任何影响。两次评估我的意思是:

var1=var2 
export "${var1}=var3"
echo "$var2"
var3

相反,只需使用:

set -a 

...在脚本的顶部。此后定义的所有变量都将自动exported- 其中包括您以前可能没有export编辑过的变量。或者,您可以只set -a使用脚本的一部分,然后set +a取消设置它 - 它也可以作为函数使用。

但子 shell 无论如何都会自动继承变量值,所以:

var1=value
( echo "$(echo "$var1")" )
value

export在这种情况下没有什么区别。

但是,如果您的脚本调用另一个脚本或解释您编辑的值的任何其他可执行文件,export并且您停止调用export它们,那么这些值将不再在其环境中可用。在下面的示例中,我使用 shell 变量$PS1(定义交互式 shell 提示的内容)来演示exported 变量的变化如何影响子进程。

export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

this is another executable
 > exit
exit

但 ...

PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

sh-4.3$ exit
exit

但话又说回来,如果您在调用进程时显式声明环境变量......

PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}

###OUTPUT###

this is another executable
 > exit
exit
sh-4.3$ exit
exit

任何ENV首先由 shell 调用的文件(例如.bashrc或 ).profile都会在该 shell 的生命周期内设置变量值。因此,export在这些文件中设置和编辑的任何变量都将保持该export特征,并export在 shell 的生命周期内或直到它们被调用之前,被该 shell 调用的所有子进程使用unset

不过,值得注意的是,它在一定程度bash上扩展了export内置函数以包含-n选项 - 这使您能够export从变量中删除属性而不unset对其进行修改,但这不是可移植的行为。

答案2

这是一个类似的线程

简短的回答:

https://superuser.com/a/153378/333431

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

这意味着export如果您打算在子 shell 中使用变量,您就应该使用变量。

你可以测试一下:

$ TEST="im_not_here"
$ echo $TEST
im_not_here
$ bash -c 'echo $TEST'
<empty output>
$ export TEST2="im_here"
$ echo $TEST2
im_here
$ bash -c 'echo $TEST2'
im_here

相关内容