在 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”