Is there a problem with having /usr/local/bin before /usr/bin on the path in OS X?
By default, OS X 10.6 uses /usr/libexec/path_helper
to add the following paths listed in the file /etc/paths
:
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
This means that /usr/bin
comes before /usr/local/bin
on the path. This results in the version of git installed by Xcode 4 in /usr/bin
to be called instead of the version installed by Homebrew into /usr/local/bin
.
Which leads me to my question, is there a problem with having /usr/local/bin
come before /usr/bin
in the path? Is there a specific reason that Apple defaults to having /usr/bin
come before /usr/local/开发者_如何学编程bin
?
How to change order of /usr/bin
and /usr/local/bin
Is it a problem to move /usr/local/bin
from the bottom of the file /etc/paths
to the top? Doing so would impact the path for more than just when I fire up Terminal, since /usr/libexec/path_helper
could be used by other resources (I'm uncertain about this).
While redundant, it seems safer for me to add /usr/local/bin
to the path in ~/.bash_profile
, which would mean that /usr/local/bin
would be on the path twice.
No, and no. They're just weird ... local by definition should override.
I had trouble with same problem, and found the link below from googling.
https://discussions.apple.com/thread/3588837?start=0&tstart=0
They said that modifying /etc/paths is not a good idea for security reasons.
I found all the above useful, especially @Ohgyun Ahn's warning. So I suggest a compromise, which I just implemented:
Edit /etc/paths
or /private/etc/paths
(as it is in OS X 10.8) and override git alone. That escapes any security implications (unrelated to git, anyway) while implementing the up-to-date git for use by all programs that actually check the system-wide path.
- Create a new directory to be used in the override, for example
/usr/local/git-override/
- Make new symlinks from git-override to homebrew's git programs. Just remake the git symlinks from
/usr/local/bin
. - add
/usr/local/git-override
to the top of(/private)/etc/paths
.
Hope that's helpful to someone else.
I would just like to add that if you want to keep your PATH clean (no duplicate entries), you can add the following to your .bash_profile to achieve the desired effect:
# remove /usr/local/bin and /usr/bin
export PATH=`echo ":$PATH:" | sed -e "s#:/usr/local/bin:#:#g" -e "s/^://" -e "s/:$//"`
export PATH=`echo ":$PATH:" | sed -e "s#:/usr/bin:#:#g" -e "s/^://" -e "s/:$//"`
# add /usr/local/bin and /usr/bin in that order
export PATH="/usr/local/bin:/usr/bin:$PATH"
I learned that little trick from http://ntk.me/2013/05/04/path-environment-variable/
Edit: Very important! Don't get the order that those are removed wrong! If you do, sed
won't work and you'll be left with /usr/local/bin:/usr/bin:
as your PATH!
It's also worth noting that the others suggesting that this could introduce some security problems are correct. Please be sure to understand the risks involved!
Since modifying the order of /etc/paths
seams to be discouraged for system stability and security ... here my solution which is based on the answer of @vmrob
read PATH < <(echo "$PATH" | sed \
-e 's/^/:/' -e 's/$/:/' \
-e 's_:/usr/local/bin:_:_g' \
-e 's_:/usr/local/sbin:_:_g' \
-e "s_:/usr/bin:/bin:_:$HOME/bin:/usr/local/bin:/usr/bin:/bin:_" \
-e "s_:/usr/sbin:/sbin:_:$HOME/sbin:/usr/local/sbin:/usr/sbin:/sbin:_" \
-e 's/^://' -e 's/:$//')
export PATH
精彩评论