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

Posted

技术标签:

【中文标题】在 OS X 的路径上 /usr/bin 之前有 /usr/local/bin 有问题吗?【英文标题】:Is there a problem with having /usr/local/bin before /usr/bin on the path in OS X? 【发布时间】:2011-07-18 21:18:59 【问题描述】:

默认情况下,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/bin 中的 git 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 将在路径上出现两次。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

由于修改/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

【讨论】:

【参考方案3】:

我发现以上所有内容都很有用,尤其是@Ohgyun Ahn's 警告。所以我建议一个折衷方案,我刚刚实施了:

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

    创建要在覆盖中使用的新目录,例如/usr/local/git-override/ 创建从 git-override 到 homebrew 的 git 程序的新符号链接。只需从 /usr/local/bin 重新制作 git 符号链接。 将/usr/local/git-override 添加到(/private)/etc/paths 的顶部。

希望对其他人有帮助。

【讨论】:

【参考方案4】:

我遇到了同样的问题,通过谷歌搜索找到了下面的链接。

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

知道修改/etc/paths 文件是否有问题,还是应该将/usr/local/bin 添加到我的~/.bash_profile 中? 两者都应该可以正常工作,但我会尽量坚持只更改每个用户的内容,这样在安装不兼容的本地版本时系统不会意外损坏。 @MatthewRankin 编辑 /etc/paths 就没有问题了!!!我之前也遇到过这个问题,谢谢你的这个问题。 :)

以上是关于在 OS X 的路径上 /usr/bin 之前有 /usr/local/bin 有问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

OS X - 无法启动 Git:/usr/bin/git 可能 Git 可执行文件的路径无效

Mac OS X 11中的/usr/bin 的“Operation not permitted”

书籍-os 相关

Mac OS X 11中的/usr/bin 的“Operation not permitted”

#!/usr/bin/python3

如何删除Mac OS X自带的python版本