在OS X的路径上/ usr / bin之前有/ usr / local / bin是否有问题?

时间:2011-03-19 20:12:49

标签: macos path

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

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

这意味着/usr/bin位于路径/usr/local/bin之前。这会导致调用/usr/bingit installed by Xcode 4的版本而不是Homebrew安装到/usr/local/bin的版本。

这引出了我的问题,/usr/local/bin在路径/usr/bin之前出现了问题吗?是否有特定原因导致Apple默认/usr/bin之前有/usr/local/bin

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

的顺序

/usr/local/bin从文件/etc/paths的底部移到顶部是否有问题?这样做会影响路径,而不仅仅是当我启动终端时,因为/usr/libexec/path_helper可以被其他资源使用(我不确定这一点)。

虽然多余,但我将/usr/local/bin添加到~/.bash_profile中的路径似乎更安全,这意味着/usr/local/bin将在路径上两次。

5 个答案:

答案 0 :(得分:27)

不,不。它们只是很奇怪......根据定义,本地应该覆盖。

答案 1 :(得分:3)

我遇到同样的问题,并在google搜索中找到了以下链接。

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

他们说出于安全原因修改 / etc / paths 并不是一个好主意。

答案 2 :(得分:2)

我发现上述所有内容都很有用,特别是@Ohgyun Ahn's警告。所以我建议妥协,我刚刚实施:

修改/etc/paths/private/etc/paths(因为它在OS X 10.8中)并且仅覆盖git 。在实现最新的git以供实际检查系统范围路径的所有程序使用时,这会逃避任何安全隐患(与git无关)。

  1. 创建要在覆盖中使用的新目录,例如/usr/local/git-override/
  2. 从git-override到homebrew的git程序创建新的符号链接。只需从/usr/local/bin重新创建git符号链接。
  3. /usr/local/git-override添加到(/private)/etc/paths的顶部。
  4. 希望这对其他人有帮助。

答案 3 :(得分:2)

我想补充一点,如果你想保持你的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:作为您的路径!

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

答案 4 :(得分:1)

由于修改了/etc/paths接缝的顺序而不鼓励系统稳定性和安全性......这里我的解决方案基于@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