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


86

尝试在新Mac上设置Homebrew(在以前的Mac上,我将从源代码安装软件包)。

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

$ brew install git

安装正常,但which git仍显示Lion/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

所以,我很困惑!我认为HomeBrew(以及创作者似乎在吹牛的东西)的意思是,您不必弄乱$PATH变量!

那么,我做错了什么?


您之前是否弄乱了自己的路径,也许将它们放在错误的位置?我也不知道为什么这是自制的“吹牛点”……它不像路径的概念,也不是修改它是一件复杂的事情,涉及到在系统中创作和散布10个不同的plists并具有特殊权限或其他功能。 ..
prodigitalson 2011年

1
与RVM不相关的部分应该是标准问题。而且,我没有抱怨必须更改路径。只是他们似乎重复了If you choose /usr/local, everything 'just works!'我不得不怀疑我所缺少的东西的主张……因为它“不起作用”。
Meltemi

Answers:


78

我发现这篇相关文章非常有帮助。无需更改$PATH变量,只需编辑/etc/paths文件即可。

自制软件要我修改路径;不知道如何

只要我跟着方向,把/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在图形文本编辑器中打开文件并进行编辑。

感谢fengd 在Stack Overflow那边了他的回答。


对于vi dimwits(像我一样),在命令模式下,请使用d剪切线并使用p粘贴线
Gerard

10
我对此会谨慎使用-更好的答案是仅修改.profile / .bash_profile中的路径并将其导出到那里。通过更改/ etc / paths,您(潜在地)影响了所有系统进程。更改.profile / .bash_profile中的PATH会将首选项本地化到您的帐户以及通过命令外壳调用的那些命令(对于我而言,这是我想要的)。如果您真的很谨慎,则可以执行@Aristotle Pagaltzis在以下答案中建议的操作。
罗尔姆斯

1
当您停止考虑存在某种严重错误时,从专为OSX设计的软件包管理器中进行的简单安装开箱即用失败了吗?更改路径可能会破坏“修复程序”和BTW,我偶然发现此提议的修复程序的原因是brew也无法更新我的路径,但是“路径”已经按照正确的顺序排列了。另一个死胡同。停止疯狂,解决根本原因。
里克·奥谢

此外,还有path_helper/etc/paths.d
西蒙·赖特

29

这个答案已经过时了。首选的Homebrew PATH排序曾经如前所述,但现在不再适用。但是,该方法更通用,因此出于兴趣考虑,我不再赘述。


你不应该

自制故意保存/usr/local/bin /usr/bin在最大兼容性的路径。PATH通过编辑/etc/paths来颠倒这些目录的顺序,则意味着系统上任何位置的所有程序,无论它们如何启动,都将获得命令的Homebrew版本。但有些人可能特别希望使用Apple的版本,或者只是无法使用较新的版本等。

如何保留此原理并仍然获得Homebrew安装的版本git?俗话说,所有问题都可以通过一层间接解决(除非有太多的间接层)。—或者在这种情况下,事实证明是两层。

具体地说,在我的Unix ~/bin开头放置一个目录已成为我Unix习惯的一部分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符号链接到符号链接,这样可以解决您的问题并使Suuss博士微笑。da,我喜欢您使用符号链接,因此我们在您中添加了一条路径,PATH以便您在符号链接时可以进行符号链接。


1
太好了,这正好回答了我想知道的事情!
2013年

这个SEEMS喜欢正确的答案,但是我不知道要运行的确切命令。创建符号链接时,我一直收到“文件存在”的信息。
瑞安2014年

抱歉,没有足够的细节来帮助您。
亚里斯多德·帕加尔齐斯

1
@Ryan确保命令中的参数正确无误ln。第一条路径是目标,第二条路径是符号链接
Freedom_Ben 2014年

1
的确如此,总之,我以过时的答案失败了,并成功(使用ZSH)在.zshrc中编辑路径的顺序export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Urs

17

您没有做错任何事情,但是似乎很清楚,如果您/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医生之间的差异#10738。请注意,本文件继续说,“常见问题解答(以上报价)是指路径设置GUI程序;医生(建议把/usr/local/bin提前/usr/bin 在你的PATH)是指路径设置CLI应用程序。”


1
这会不会/usr/local/bin在我身上留下两个秒$PATH?我相信是这样。我想知道我们是否应该编辑默认路径的顺序/etc/paths或中的内容/etc/paths.d?但这将影响到每个用户...可能不是一件坏事。无论如何,只是想看看其他人是如何做到这一点的。
Meltemi

@Meltemi,这个答案的精神是正确的:更新PATH(在您选择的方式)有/usr/local/bin上一页/usr/bin。我个人更新我PATH.bash_profile这里建议。

@ Nick-有趣的信息...仅用于混淆问题(至少是我的问题)...自制文档似乎暗示即使Terminal Commands尾随/usr/local/bin路径/usr/bin,它也应该拾取应用程序。但是GUI应用程序需要特殊处理吗?IT似乎所有应用程序(无论是否为GUI)都需要我们调整$ PATH变量。那么,我(或自制软件的创造者)想念的是什么?
Meltemi

我认为Homebrew假设您要先使用Apple提供的可执行文件-git是一个更改,直到Lion不由Apple提供,因此Homebrew需要它-现在您可以使用Apple了,
user151019 2011年

我同意马克的观点。对于MacPorts和Fink,人们的假设是要提供一个完全原始的,独立的环境,而不是苹果提供的任何现成产品。Homebrew认为苹果的产品很棒,并且不避免使用它(为什么苹果可能会下载另一个版本的gcc?)。
尼克·克劳尔

6

我不同意jthomas的回答。编辑/ etc / paths文件将更改所有程序的加载路径。如果系统应用程序期望找到特定版本的二进制文件但由于您编辑了路径文件而找到了其他版本,则可能会很危险。而是在〜/ .bashrc(或〜/ .bash_profile)中更改路径变量。然后,您的加载路径将仅在终端内部更改:

#将自制程序添加到PATH
导出PATH = / path / to / homebrew / app / bin:$ PATH

然后重新加载bash或source ~/.bashrc,就可以了。由于homebrew路径先于其他,因此bash将加载您通过homebrew下载的版本。


在OS X中,.bashrc默认情况下未加载。您是否手动采购?
slhck

哦耶。我从OS X来自Ubuntu和使用具有.bashrc这样我从我的源它.bash_profile。如果您不想创建rc文件,可以将命令添加到.bash_profile
内森

5

据我了解,brew没有任何东西/usr/local/bin可以与Apple分布式可执行文件相撞(具有相同的名称)。因此,具有/usr/local/bin在路径之前/bin/usr/bin不应该是一个问题,因为应该没有名称冲突。*但是,看问题有lstar,和使用其它包装聚合像finkport(使用MacPorts),远低于。

Brew 我知道有助于管理名称冲突的两件事之一:

  1. Brew将未链接的小桶留在地窖中。 要安装东西,brew将工具留在原处,并在中创建指向这些工具的符号链接/usr/local/bin。对于brew不希望与名称冲突的工具,它不会创建符号链接。
  2. 对于许多(如果不是全部)同样位于/bin和中的标准工具/usr/bin,请brew在链接中/usr/local/bin添加前缀“ g”,例如,要ls使用brew版本执行,请使用gls 只需做一个ls -lin /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安装lstar命令无法正确处理文件系统ACL,实际上是我上次检查(即上周)时没有,根本没有处理。这是一个很大的问题,为了完全避免它,以及与man标签相关的页面配置问题以及设置$PATH正确的权限,我确保将OSX相关工具(尤其是在/bin和中找到的工具)/usr/bin放在首位。

我什至不愿意走的另一个原因/usr/local/bin是因为brew与他人的配合不佳,并且finkand port(MacPorts)目前拥有更多需要我现在支持的软件包。例如,我可以gnome-terminal使用fink,但是构建一个公式并使用进行相同的工作会很费力brew。因此,在搜索时,我会保留/sw/opt搜索$PATH(分别为finkport),并从中引用所需的内容/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个月内中断某些工作!


感谢您提供有用的信息。但是请注意,在我的系统上,我确实在/ usr / bin和/ usr / local / bin中都具有相同名称的可执行文件(例如git,如您所述,它是符号链接的)。因此,它们在默认情况下确实会发生冲突。我也确实想为我的Shell工作覆盖系统工具。
罗尔姆斯

4

这里有很多好的答案。这是我的:

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,则其工作原理相同;只需切换出来bashrczshrc。您可以切换出my_,甚至@以节省打字。


2

而不是完全弄乱PATH(几个月后又回到我的历史中),我在zsh自定义别名目录(〜/ .zshrc / custom / git_alias.zsh)中添加了git的别名。

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


0

我更喜欢将更改限制为环境变量,例如$PATH实际需要更改的用户。因此,我只需将以下内容添加到~/.bashrc

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

0

您可以在终端中发出以下命令,它将在您的任何SHELL“ rc”初始化文件(bash,zsh,csh)的PATH中添加brew主目录+ / bin。

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

请享用 !

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.