尝试设置自制在新的 Mac 上(在以前的 Mac 上,我会从源代码安装软件包)。
我尝试安装的第一个包是 Git:
$ brew install git
安装顺利,但which git
仍然显示/usr/bin/git
随附的狮子(我认为?)。而且不是/usr/local/bin/git
刚刚安装的那个。
$ echo $PATH
/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@rails31/bin:/Users/meltemi/.rvm/gems/ruby-1.9.2-p290@global/bin:/Users/meltemi/.rvm/rubies/ruby-1.9.2-p290/bin:/Users/michael/.rvm/bin:/usr/local/mysql/bin:/opt/subversion/bin:/Developer/Additions/checker/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
正如你所见,/usr/bin
默认/usr/local/bin
为$PATH
所以,我很困惑!我认为自酿啤酒(并且创作者似乎对此吹嘘不已)您不必弄乱变量$PATH
!?!?
那么,我做错了什么?
答案1
我发现这篇相关文章非常有用。它不需要更改$PATH
变量,只需编辑/etc/paths
文件即可。
一旦我按照上述说明操作/usr/local/bin
,/usr/bin
我的问题就解决了。
- 在 OS X 上,打开终端
- 输入命令:
sudo vi /etc/paths
- 如果需要,请输入密码
- 您将看到路径列表。编辑它们,以便路径在路径
/usr/local/bin
上方输入/usr/bin
- *保存并退出
- 重启终端
这是我完成之后的样子:
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
*要保存并退出,请输入冒号 ( :
),然后输入wq
(同时写入并退出),接着输入Enter。
您也可以/etc/paths
在图形文本编辑器中打开该文件并以此方式进行编辑。
归功于锋德 在 Stack Overflow 上查看他的答案。
答案2
这个答案已经过时了。首选的 HomebrewPATH
顺序曾经如解释的那样,但现在已不再如此。但是,这种方法更普遍适用,因此出于兴趣,我将其保留下来。
你不应该。
Homebrew 有意保留/usr/local/bin
后 /usr/bin
PATH
在路径中以实现最大兼容性。通过编辑反转这些目录的顺序/etc/paths
意味着全部系统上任何地方的程序,无论它们是如何启动的,都将获得 Homebrew 版本的命令。但有些程序可能特别需要 Apple 的版本,或者无法使用较新的版本等。
如何保留这一原则,同时仍然获得 Homebrew 安装的版本git
?俗话说,所有问题都可以通过一个间接层来解决(除非间接层太多)。——或者在这种情况下,事实证明是两层。
具体来说,我习惯在 Unix 中将一个~/bin
目录放在 的开头PATH
。这是我的 中的前几部分之一.bashrc
:
[[ :$PATH: == *:$HOME/bin:* ]] || PATH=$HOME/bin:$PATH
这将检查是否PATH
包含~/bin
,如果不包含,则将其添加到前面。有了这个,然后有选择地使 Homebrew 管理的版本git
优先于系统版本(而不是每一个Homebrew 管理的二进制文件),并且只用于你的 shell 会话(而不是全部启动任何程序(包括 GUI 程序)都很简单,只需对其进行符号链接即可:
ln -s /usr/local/bin/git ~/bin/git
你可以直接进行符号链接/usr/local/Cellar/git/1.8.2.1/bin/git
,但每次执行(直接或间接)操作时,您都必须修复符号链接brew upgrade git
。通过符号链接到 Homebrew 的固定位置符号链接,您不必担心这一点。
因此,您将目录添加到您的目录中$HOME
,以便将其添加到您的PATH
目录中,以便您可以将其符号链接到符号链接,这解决了您的问题,并让苏斯博士露出笑容。哟,伙计,我知道你喜欢符号链接,所以我们将路径添加到您的目录中,PATH
以便您可以在进行符号链接时进行符号链接。
答案3
你没有做错什么,但很明显,如果你/usr/local/bin
之前在路径中/usr/bin
这样做,这个特定问题就会消失。最简单的解决方法就是这样做,然后输入类似
export PATH=/usr/local/bin:$PATH
在您的~/.bash_profile
系统中,Homebrew 安装的所有内容都会首先被找到。这就是我在 Mac 上设置的方式,并且它对我来说一直有效,但是,YMMV。
他们似乎确实相信/usr/local/bin
,后 /usr/bin
,因此,尽管我可能弄乱了我自己的$PATH
,但我可以看到他们的文档缺少什么:
请注意,您应该将其放在
/usr/local/bin
后面,/usr/bin
因为某些程序会期望获得系统版本(例如 ruby),并且如果获得较新的 Homebrew 版本,则会中断。
从wiki 和 brew doctor 之间的差异 #10738。请注意,该文档继续说道:“常见问题解答(上面的引文)指的是 GUI 应用程序的 PATH 设置;医生( 在 PATH 中/usr/local/bin
提前提出的建议)指的是 CLI 应用程序的 PATH 设置。”/usr/bin
答案4
据我所知,brew
不会将任何/usr/local/bin
与 Apple 分布式可执行文件冲突(同名)的内容放入其中。因此,/usr/local/bin
在路径中将/bin
和放在前面应该不是问题,因为不应该存在名称冲突。*但是,请参见下文中有关和以及使用其他软件包聚合器(如和(MacPorts))/usr/bin
的问题。ls
tar
fink
port
Brew
据我所知,有两件事可以帮助管理名称冲突:
Brew
将未连接的酒桶留在地窖中。 要安装东西,brew 会将工具保留在原处,并在 中创建指向这些工具的符号链接/usr/local/bin
。对于brew
不想与 发生名称冲突的工具,它不会创建符号链接。/bin
对于许多(如果不是全部)也位于和中的标准工具/usr/bin
,brew
在链接前加上/usr/local/bin
“g”前缀,例如,要ls
使用 brew 版本执行,请使用gls
。 只需进入ls -l
并/usr/local/bin
查找链接的文件 - 这些就是brew
放在那里的文件。注意:brew
必须通过其真实名称访问的已安装工具位于 中/usr/local/Cellar/coreutils/8.21/libexec/gnubin
。
我不会/usr/local/bin
出于两个原因而放弃我的道路——这两个原因都在我的答案的底部。
要评估系统中的名称冲突,请使用brew doctor
并查找此部分 - 以下是brew doctor
感兴趣的输出:
Warning: /usr/bin occurs before /usr/local/bin
This means that system-provided programs will be used instead of those
provided by Homebrew. The following tools exist at both paths:
ctags
emacs
emacsclient
etags
ex
git
git-cvsserver
git-receive-pack
git-shell
git-upload-archive
git-upload-pack
rview
rvim
view
vim
vimdiff
vimtutor
xxd
Consider setting your PATH so that /usr/local/bin
occurs before /usr/bin. Here is a one-liner:
echo export PATH='/usr/local/bin:$PATH' >> ~/.bash_profile
我没有把brew
的工具放在第一位,事实上,根本没有,是因为brew
安装的ls
和tar
命令不能正确处理文件系统 ACL,事实上,上次我检查时(上周),他们根本没有得到处理。这是一个大问题,为了完全避免它,以及与man
设置权限相关的页面配置问题$PATH
,我确保首先放置相关工具,特别是在和OSX
中找到的工具。/bin
/usr/bin
我根本不把它放在/usr/local/bin
我的路径中的另一个原因是它brew
不能很好地与其他软件包配合使用,而且fink
( port
MacPorts) 目前有更多我需要的支持包现在。例如,我可以用 得到gnome-terminal
,fink
但构建一个公式并对 执行相同操作将是一项巨大的努力brew
。因此,我在搜索中保留/sw
和(分别搜索和),并从 中引用我需要的东西,包括,要么拼写出来,要么我使用,或者我在编写代码时为完全不同的环境提供文件。/opt
$PATH
fink
port
/usr/local/bin
gnat
bash
alias
setup
Ada
问题是,这确实取决于您当时想要什么和需要什么。
下面是我上面提到的 ACL 问题的一个例子。
使用标准OSX
工具:
$ /bin/ls -le /var/root | head -7
total 24
drwx------+ 3 root wheel 102 May 28 2013 Desktop
0: group:everyone deny delete
1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit
drwx------+ 6 root wheel 204 Sep 19 14:22 Documents
0: group:everyone deny delete
1: user:_spotlight inherited allow list,search,readattr,readextattr,readsecurity,file_inherit,directory_inherit
并使用brew
已安装的工具:
$ /usr/local/bin/gls -le /var/root
/usr/local/bin/gls: invalid option -- 'e'
Try '/usr/local/bin/gls --help' for more information.
和
$ /usr/local/bin/gls --help | grep -i acl
tar
使用其他许多工具,你也会得到类似的结果brew
,但是谁能承受因为一个ACL
问题而导致 6 个月后出现故障的后果呢?