如何在不更改 $PATH 的情况下重新加载 .bash_profile?
How to reload .bash_profile without changing $PATH?
我想弄清楚如何在不注销 Bash 会话或退出终端的情况下加载对 .bash_profile
的更改,也不影响我的 $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
每次重新加载时都更新?
好的,第一个技巧:您使用
重新加载脚本,如 .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,那里有很多有用的东西。
我能想到的最简单的方法,更改您的别名,以便它存储现有路径并在获取文件后重置它:
alias reload='tmp=$PATH;source ~/.bash_profile;export PATH=$tmp'
或者,如果值不存在,您可以在插入或附加到 PATH 之前检查:
insert_to_path()
{
if [[ "$PATH" =~ (^|:)""(:|$) ]]
then
return 0
fi
export PATH=:$PATH
}
insert_to_path /usr/local/bin
insert_to_path /usr/local/heroku/bin
我想弄清楚如何在不注销 Bash 会话或退出终端的情况下加载对 .bash_profile
的更改,也不影响我的 $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
每次重新加载时都更新?
好的,第一个技巧:您使用
重新加载脚本,如 .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,那里有很多有用的东西。
我能想到的最简单的方法,更改您的别名,以便它存储现有路径并在获取文件后重置它:
alias reload='tmp=$PATH;source ~/.bash_profile;export PATH=$tmp'
或者,如果值不存在,您可以在插入或附加到 PATH 之前检查:
insert_to_path()
{
if [[ "$PATH" =~ (^|:)""(:|$) ]]
then
return 0
fi
export PATH=:$PATH
}
insert_to_path /usr/local/bin
insert_to_path /usr/local/heroku/bin