如何在不更改$ PATH的情况下重新加载.bash_profile?

时间:2015-01-25 19:36:52

标签: bash unix path

我试图找出如何加载对.bash_profile的更改,而无需退出我的Bash会话或退出终端,也不会影响我的$PATH

在新会话中,这是我的$PATH

/Users/MyName/.rbenv/shims:/usr/local/heroku/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/usr/local/go/bin

这是我设置的用于重新加载.bash_profile的别名:

alias reload='source ~/.bash_profile'

当我运行reload命令时,我对.bash_profile的更改已加载,但每次运行命令时我的$PATH都会延长。

例如:

>> reload

>> echo $PATH

/Users/MyName/.rbenv/shims:/usr/local/heroku/bin:/usr/local/bin:/Users/MyName/.rbenv/shims:/usr/local/heroku/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/git/bin:/usr/local/go/bin

正如您所看到的那样$PATH现在更长了,我认为这是因为以下内容属于.bash_profile

export PATH="/usr/local/bin:$PATH"
export PATH="/usr/local/heroku/bin:$PATH"

如何在每次重新加载时保持$PATH不被更新?

3 个答案:

答案 0 :(得分:6)

好的,第一步:你使用

重新加载像.bash_profile这样的脚本
$ source .bash_profile

内置源读取shell脚本,就好像它来自标准输入,而不是分支子shell。

特技第二:那个作业

PATH=/my/new/path:$PATH

只是将PATH中已有的内容附加到新字符串中。所以,这就像做

PATH=/my/new/path:my/old/path/:/my/even/older/path

你不喜欢这种行为,你只需要先重置PATH。我的工作是这样的:

PATH=
PATH=/bin:$PATH
PATH=/usr/bin:$PATH

等等。现在路径将完全符合您的期望。

<强>更新

以下是我的文件的确切内容:

export PATH=
export PATH=/bin
export PATH=${PATH}:/sbin
export PATH=${PATH}:/usr/local/bin
export PATH=${PATH}:/usr/sbin
export PATH=${PATH}:/usr/bin
export PATH=${PATH}:/usr/local/opt/go/libexec/bin

exports并不重要,因为PATH已经导出,他们只是我很挑剔。

对于我设置shell的其他一些内容,您还可以查看此答案:About .bash_profile, .bashrc, and where should alias be written in?

你应该看看Bash Guide for Beginners,那里有很多有用的东西。

答案 1 :(得分:2)

或者,如果值已经存在,您可以在插入或附加到PATH之前进行检查:

insert_to_path()
{
    if [[ "$PATH" =~ (^|:)"${1}"(:|$) ]]
    then
        return 0
    fi
    export PATH=${1}:$PATH
}

insert_to_path /usr/local/bin
insert_to_path /usr/local/heroku/bin

答案 2 :(得分:0)

我能想到的最简单的方法,更改别名,以便它存储现有路径并在获取文件后重置它:

alias reload='tmp=$PATH;source ~/.bash_profile;export PATH=$tmp'