2011-08-17 19:36:41 +0000 2011-08-17 19:36:41 +0000
86
86

我应该如何设置Mac上的PATH变量,以便找到Hombrew安装的工具?

试图在新的Mac上设置Homebrew(在以前的Mac上我会从源头安装包)。

我尝试安装的第一个软件包是 Git。

$ brew install git

安装正常,但which git仍然显示/usr/bin/git中的那个随Lion(我想?而不是/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之前的

所以,我很疑惑! 我以为HomeBrew的重点(也是创造者们似乎在吹嘘的东西)是你不需要搞乱$PATH变量!?

那么,我做错了什么?

答案 (9)

79
79
79
2013-01-13 22:35:02 +0000

我发现这个相关的帖子非常有用。它没有改变$PATH变量,而是让你简单地编辑你的/etc/paths文件。 Homebrew要我修改我的PATH;不知道怎么修改

只要我按照指示把/usr/local/bin放在/usr/bin上面,我的问题就解决了。

1.在OS X上,打开终端 2. 输入命令。sudo vi /etc/paths 3. 输入你的密码,如果你被要求输入密码 4. 你会看到一个路径列表。编辑它们,使/usr/local/bin路径上方输入/usr/bin路径 5. **保存并退出 6. 重新启动终端

这是我做完这些后的样子。

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

*要保存和退出,输入冒号(:),然后输入wq(同时写入和退出),接着输入Enter。

你也可以在图形文本编辑器中打开/etc/paths文件,然后用这种方式编辑。

归功于 Stack Overflow 的 fengd ,他在那边给出了答案。

29
29
29
2013-04-09 23:28:21 +0000

这个答案已经过时了。以前首选的Homebrew PATH排序是如解释的那样,但现在已经不是这样了。然而,这种方法更普遍适用,所以为了兴趣,我就不说了。


你不应该这样做。

Homebrew有意将/usr/local/bin after /usr/bin保留在路径中,以达到最大的兼容性。通过编辑PATH来颠倒这些目录的顺序,意味着系统上任何地方的所有程序,无论它们是如何启动的,都会得到Homebrew版本的命令。但有些人可能会特别期待苹果的版本,或者就是不能使用较新的版本等。

如何保留这个原则,还能得到Homebrew安装的/etc/paths版本?俗话说的好,所有的问题都可以通过一层间接来解决(除了有太多的间接层)。- 或者在这种情况下,事实证明是两层。

具体来说,我的Unix习惯之一就是有一个git目录,我把它放在~/bin的开头。这是我的PATH的第一个位子之一。

[[:$PATH: == *:$HOME/bin:*]] || PATH=$HOME/bin:$PATH

这将检查.bashrc是否包含PATH,如果不包含,则将其前置。有了这一点,那么有选择地让Homebrew管理的~/bin优先于系统版本(而不是每一个Homebrew管理的二进制文件),并且只针对你的shell会话(而不是所有从任何地方启动的程序,包括GUI程序),就像建立符号链接一样简单。

ln -s /usr/local/bin/git ~/bin/git

你可以直接用符号链接git,但是每次你做/usr/local/Cellar/git/1.8.2.1/bin/git的时候,你都要修正你的符号链接(直接或间接)。通过与Homebrew的固定位置符号链接,你就不用担心这个问题了。

所以你在你的brew upgrade git上加一个目录,这样你就可以把它加到你的$HOME上,这样你就可以把它加到一个符号链接上,这样就解决了你的问题,让苏斯博士露出了笑容。哟,老兄,我听说你喜欢symlinks,所以我们在你的PATH里加个路径,这样你就可以在你的symlink里加symlink了。

18
18
18
2011-08-17 19:42:55 +0000

你并没有做错什么,但很明显,如果你在/usr/local/bin之前的路径中加入/usr/bin,这个特定的问题就会消失。最简单的解决方法就是这样做,在你的~/.bash_profile中加入类似

export PATH=/usr/local/bin:$PATH

的内容,这样Homebrew安装的所有东西都会被首先找到。这就是我在Mac上的设置方式,而且它为我工作了这么久,不过,YMMV。

看起来他们确实认为/usr/local/bin/usr/bin之后也能工作,所以虽然我可能把我自己的$PATH弄得一团糟,但我可以看到他们的文档缺乏的地方。

请注意,你应该把/usr/local/bin放在/usr/bin之后,因为有些程序会期望 得到系统版本,例如,ruby,如果得到较新的Homebrew版本就会崩溃。

From Discrepancy between wiki & brew doctor #10738 .  注意,这个文档接着说,"The FAQ(上面的引用)指的是GUI应用程序的PATH设置;医生(建议在你的PATH中把/usr/local/bin放在/usr/bin前面)指的是CLI应用程序的PATH设置。"

6
6
6
2013-04-03 19:28:03 +0000

我不同意jthomas的回答。编辑你的/etc/paths文件会改变所有程序的加载路径。如果一个系统程序希望找到一个特定版本的二进制文件,但却因为你编辑了路径文件而找到了一个不同的版本,那么这可能是危险的。相反,修改 ~/.bashrc (或 ~/.bash/_profile) 中的路径变量。然后你的加载路径只会在终端内改变。

将homebrew应用添加到PATH

export PATH=/path/to/homebrew/app/bin:$PATH

然后重新加载bash或source ~/.bashrc,就可以了。由于homebrew路径在前面,所以bash会加载你用homebrew下载的版本。

5
5
5
2014-01-03 22:07:43 +0000

根据我的理解,brew中不会放入任何与苹果分布式可执行文件碰撞(同名)的东西。因此,在/usr/local/bin/usr/local/bin之前的路径中有/bin应该不是问题,因为应该没有名称碰撞。**不过,请看下面/usr/binls的问题,以及使用其他包聚合器,如tarfink(MacPorts)的方式。

port做了两件事中的一件,据我所知,有助于管理名称碰撞。

  1. Brew在Cellar中留下未链接的酒桶.要安装东西,brew会将工具留在原地,并在Brew中为这些工具创建符号链接。对于/usr/local/bin不想与之发生名称冲突的工具,它不会创建符号链接。
  2. 对于许多甚至所有也在brew/bin中的标准工具,/usr/bin会在brew中用 “g "作为链接的前缀,因此,例如,如果要执行/usr/local/bin与brew版本,请使用ls.只需在gls中进行ls -l,然后查找链接的文件–那些是/usr/local/bin放在那里的。注意:brew安装的工具,必须用实名访问,在brew中找到。

我不把/usr/local/Cellar/coreutils/8.21/libexec/gnubin放在我的路径中,有两个原因–这些原因在我的答案底部。

要评估你系统中的名称碰撞,请使用/usr/local/bin,并查找这一部分–这是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 doctor的工具放在第一位,其实根本不是,是因为安装了brewbrewls命令没有正确处理文件系统ACL,事实上,上次我检查的时候(也就是上周),它们根本没有被处理。这是一个很大的问题,为了完全避免它,以及相关的tar页面配置问题,随着正确设置man的标签,我确保我把$PATH相关的工具,特别是那些在OSX/bin中发现的工具,首先。

我根本不把/usr/bin放在我的路径中的另一个原因是,/usr/local/bin和其他的工具玩得不好,而且brewfink(MacPorts)目前有更多的支持包,我现在需要NOW。例如,我可以用port得到gnome-terminal,但如果要构造一个公式,用fink做同样的事情,那就很费劲了。所以,我在搜索brew的时候会保留/sw/opt(分别用于$PATHfink),并从port中引用我需要的东西,包括/usr/local/bin,要么是拼出来的,要么是我用gnat bash的,要么是我在写alias代码的时候,会源码一个完全不同环境的setup文件。

问题是,这真的取决于你当时想要什么,需要什么。

这是我上面提到的ACL问题的一个例子。

用标准的Ada工具:

$ /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

OSX安装的工具:

$ /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

你用brew也会得到类似的结果,我不知道家很多其他的tar工具,但谁能承受6个月后因为一个brew的问题而让东西坏掉呢!

4
4
4
2014-09-18 20:46:55 +0000

这里有一大堆好答案。这是我的答案。

echo >> ~/.bashrc alias my="PATH=/usr/local/bin:$PATH"
. ~/.bashrc
my git --version # Brew's fancy git
git --version # Apple's old crusty git

省去了你为每个程序创建一个单独的别名,而且作为奖励,它还能在你需要的时候访问默认安装。

如果你使用ZSH,工作原理是一样的;只要把bashrc换成zshrc就可以了。你可以把my换成_,甚至是@,以节省输入。

2
2
2
2013-07-30 18:47:40 +0000

我在zsh自定义别名目录下(~/.zshrc/custom/git/alias.zsh)为git添加了一个别名,而不是在PATH上做手脚(在我的历史上,这在几个月后就会让我后悔)。

alias git='/usr/local/bin/git'

0
0
0
2017-05-23 17:29:13 +0000

你可以在终端中发出以下命令,它会在你的任何SHELL “rc "init文件(bash,zsh,csh)的PATH中添加brew home目录+/bin,

echo "export PATH="'$PATH:$(brew --prefix)/bin' >> ~/.$(basename $SHELL)rc

Enjoy !

0
0
0
2014-03-21 11:54:36 +0000

我更倾向于限制对环境变量(如$PATH)的修改,让那些真正想要修改的用户知道。因此,我只需在~/.bashrc中添加以下内容。

export PATH="$(brew --prefix)/bin:$PATH"