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


70

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

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

这意味着这/usr/bin/usr/local/bin前进的道路。这导致的版本通过的Xcode 4的git安装/usr/bin被调用,而不是通过自制软件安装到的版本/usr/local/bin

这就引出我的问题,在这条道路上/usr/local/bin走之前是否有问题/usr/bin?是否有一个具体的理由,苹果默认为已经/usr/bin来之前/usr/local/bin

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

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

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

Answers:


27

不,不。他们只是怪异的...按照定义,本地应该被覆盖。


知道是否有修改/etc/paths文件的问题,还是应该添加/usr/local/bin到我的文件中~/.bash_profile
马修·兰金

4
两种方法都可以正常工作,但是我会尽量坚持只更改每用户的内容,以免在安装了不兼容的本地版本时意外损坏系统。
福雷斯特·福伊特

@MatthewRankin编辑/ etc / paths将没有问题!!!我之前也遇到过这个问题,谢谢您提出这个问题。:)
华尼托法塔斯


2

我发现以上所有内容都很有用,尤其是@Ohgyun Ahn的警告。因此,我提出了一个折衷方案,我刚刚实现了:

编辑/etc/paths/private/etc/paths(如在OS X 10.8中一样)并单独覆盖git。在实施最新的git以供实际检查系统范围路径的所有程序使用时,可以避免任何安全隐患(无论如何与git无关)。

  1. 创建一个新目录以供覆盖中使用,例如 /usr/local/git-override/
  2. 从git-override到自制的git程序建立新的符号链接。只需从重新制作git符号链接/usr/local/bin
  3. 添加/usr/local/git-override到的顶部(/private)/etc/paths

希望对其他人有帮助。


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:在自己的PATH中!

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


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.