在OS X的path上的/ usr / bin之前有/ usr / local / bin有问题吗?

默认情况下,OS X 10.6使用/usr/libexec/path_helper添加文件/etc/paths列出的以下/etc/paths

 /usr/bin /bin /usr/sbin /sbin /usr/local/bin 

这意味着/usr/bin在path上的/usr/local/bin之前。 这会导致在/usr/bin 由Xcode 4安装的git版本被调用,而不是由Homebrew安装到/usr/local/bin

这导致我的问题,有/usr/local/binpath之前/usr/bin中有问题吗? 是否有一个特定的原因,苹果默认有/usr/bin/usr/local/bin

如何更改/usr/bin/usr/local/bin顺序

/usr/local/bin从文件/etc/paths的底部移动到顶部是否有问题? 因为/usr/libexec/path_helper可能被其他资源使用(我对此不确定),所以这样做不仅会影响到terminal启动的path。

虽然是多余的,但我认为将/usr/local/bin~/.bash_profile的path似乎更安全,这意味着/usr/local/bin将在path上两次。

不,不,不。 他们只是奇怪的…本地的定义应该重写。

我遇到了同样的问题,并发现下面的链接从谷歌search。

https://discussions.apple.com/thread/3588837?start=0&tstart=0

他们说修改/ etc /path不是出于安全原因的好主意。

我发现以上所有的东西都有用,尤其是@Ogygyun Ahn的警告。 所以我提出了一个妥协,我刚刚实施:

编辑/etc/paths/private/etc/paths (因为它是在OS X 10.8),并单独覆盖git 。 这就避免了任何安全问题(与git无关),同时实现了最新的git,供所有真正检查系统范围path的程序使用。

  1. 创build一个新的目录用于覆盖,例如/usr/local/git-override/
  2. 从git-override制作新的符号链接到homebrew的git程序。 只需重新编译/usr/local/bin的git符号链接即可。
  3. /usr/local/git-override(/private)/etc/paths的顶部。

希望对别人有帮助。

我只想补充一点,如果你想保持你的PATH干净(没有重复的条目),你可以添加以下到你的.bash_profile来达到预期的效果:

 # 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" 

我从http://ntk.me/2013/05/04/path-environment-variable/学到了一点小技巧;

编辑:非常重要! 不要得到那些被删除错误的命令! 如果你这样做, sed将不能工作,你将留下/usr/local/bin:/usr/bin:作为你的PATH!

另外值得注意的是,其他人认为这可能会带来一些安全问题是正确的。 请务必了解所涉及的风险!

由于修改/etc/paths的顺序,所以不鼓励系统的稳定性和安全性…这里我的解决scheme是基于@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