Como devo definir a variável PATH no meu Mac para que as ferramentas instaladas pelo Hombrew sejam encontradas?

86

Tentando configurar o Homebrew em um novo Mac (em Macs anteriores eu instalaria pacotes a partir da fonte).

O primeiro pacote que tentei instalar foi o Git:

$ brew install git

A instalação correu bem, mas which gitainda mostra a /usr/bin/gitque acompanha o Lion (acho?). E não aquele /usr/local/bin/gitque acabou de ser instalado.

$ 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

Como você pode ver os /usr/binpadrões anteriores /usr/local/binno$PATH

Então, eu estou confuso! Eu pensei que o objetivo do HomeBrew (e algo que os criadores parecem se gabar) era que você não precisa mexer com a $PATHvariável!?!

Então, o que eu fiz de errado?

Meltemi
fonte
você mexeu com seu caminho anteriormente e talvez os tenha colocado na ordem errada? Também não sei ao certo por que esse é um homebrew do formulário "ponto de se gabar" ... não gosta do conceito de caminho ou modificá-lo. É uma coisa complexa que envolve a criação e a aspersão de 10 listas diferentes em seu sistema com permissões especiais ou algo assim. ..
prodigitalson 17/08/11
1
caminho, bem, a parte que não está relacionada ao RVM, deve ser um problema padrão. E não, não estou reclamando de ter que mudar o caminho. Só que eles parecem repetir a afirmação de If you choose /usr/local, everything 'just works!'que eu tenho que me perguntar o que estou perdendo ... porque não "apenas funciona".
Meltemi

Respostas:

78

Achei este post relacionado muito útil. Em vez de alterar a $PATHvariável, basta editar o seu /etc/pathsarquivo.

Homebrew quer que eu altere meu CAMINHO; nenhuma pista de como

Assim que segui as instruções e pus /usr/local/binacima /usr/bin, meus problemas foram resolvidos.

  1. No OS X, abra o Terminal
  2. Digite o comando: sudo vi /etc/paths
  3. Digite sua senha se for solicitado
  4. Você verá uma lista de caminhos. Edite-os para que o /usr/local/bincaminho seja inserido acima do /usr/bincaminho
  5. * Salve e saia
  6. Reiniciar terminal

Aqui está a minha aparência depois que eu fiz isso:

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

* Para salvar e sair, digite dois pontos ( :) e digite wq(para escrever e sair ao mesmo tempo), seguido por Enter.

Você também pode abrir o /etc/pathsarquivo em um editor de texto gráfico e editá-lo dessa maneira.

Crédito para se vingar de Stack Overflow por sua resposta lá.

jthomas
fonte
Para vi idiotas (como eu) usar d para cortar uma linha e p para colá-lo quando no modo de comando
Gerard
10
Gostaria de ter cuidado com isso - a melhor resposta é apenas alterar o caminho em .profile / .bash_profile e exportá-lo para lá. Ao alterar o / etc / caminhos, você (potencialmente) afeta todos os processos do sistema; alterar PATH em .profile / .bash_profile localiza a preferência da sua conta e dos comandos invocados por meio do shell de comando (que, no meu caso de desenvolvimento, é o que eu quero). Se você for realmente cauteloso, faça o que @Aristotle Pagaltzis sugere na resposta abaixo.
Rholmes 16/05
1
Há algum momento em que você para para considerar que há algo terrivelmente errado que uma instalação simples de um gerenciador de pacotes projetada para OSX está falhando prontamente? Alterar o seu caminho é uma "correção" potencialmente quebrada e, aliás, o motivo pelo qual me deparei com essa correção proposta é que o brew não atualiza meu caminho também, mas "caminhos" já está na ordem correta. Outro beco sem saída. Pare a loucura, conserte a causa raiz.
Rick O'Shea
Além disso, há path_helpere /etc/paths.d.
Simon Wright
29

Esta resposta é obsoleta. O PATHpedido Homebrew preferido costumava ser o que foi explicado, mas isso não é mais verdade. No entanto, a abordagem é mais aplicável em geral; portanto, pelo interesse, estou deixando de lado.


Você não deveria.

Homebrew mantém intencionalmente /usr/local/bin depois /usr/bin no caminho para compatibilidade máxima. Inverter a ordem desses diretórios PATHeditando /etc/pathssignifica que todos os programas em qualquer lugar do sistema, independentemente de como foram iniciados, obterão a versão Homebrew de um comando. Mas alguns podem esperar especificamente a versão da Apple ou simplesmente não conseguir usar uma versão mais recente etc.

Como preservar esse princípio e ainda obter a versão instalada do Homebrew git? Como diz o ditado, todos os problemas podem ser resolvidos com uma camada de indireção (exceto com muitas camadas de indireção). - Ou neste caso, como se vê, duas camadas.

Especificamente, faz parte dos meus hábitos no Unix ter um ~/bindiretório que eu coloquei no início do meu PATH. Este é um dos primeiros bits no meu .bashrc:

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

Isso verifica se o PATHcontém ~/bine, se não, o precede. Com isso em prática, fazer seletivamente apenas o gerenciado pelo Homebrew gitter precedência sobre a versão do sistema (em vez de todos os binários gerenciados pelo Homebrew) e apenas as sessões do shell (em vez de todos os programas iniciados de qualquer lugar, incluindo programas da GUI), é tão simples quanto simbolizando:

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

Você pode ligar o link simbólico /usr/local/Cellar/git/1.8.2.1/bin/gitdiretamente, mas precisará corrigi-lo toda vez que fizer um brew upgrade git(direta ou indiretamente). Ligando o link simbólico para local fixo do Homebrew, você não precisa se preocupar com isso.

Então você adiciona um diretório ao seu, $HOMEpara poder adicioná- PATHlo a um link simbólico, e isso resolve o seu problema e coloca um sorriso no Dr. Seuss. Yo dawg Eu agrupo você como links simbólicos, então colocamos um caminho no seu PATHpara que você possa fazer o link simbólico enquanto faz o link simbólico.

Aristóteles Pagaltzis
fonte
1
Excelente, isso responde exatamente o que eu estava pensando!
N_A
Parece a resposta certa, mas não consigo descobrir os comandos exatos a serem executados. Eu continuo recebendo "O arquivo existe" ao criar links simbólicos.
21713 Ryan
Não há detalhes suficientes para ajudá-lo, desculpe.
Aristóteles Pagaltzis
1
@ Ryan, verifique se você tem a ordem dos argumentos corretos no lncomando. O primeiro caminho é o alvo, e o segundo é o link simbólico #
Freedom_Ben
1
verdade que, no El Cap, eu falhei com a resposta obsoleto e conseguiu com (eu uso ZSH) a edição de fim do caminho no .zshrcexport PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Urs
17

Você não fez nada de errado, mas parece bastante claro que se você estivesse /usr/local/binno seu caminho antes que /usr/binesse problema específico desaparecesse. A solução mais fácil é fazer exatamente isso e colocar algo como

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

no seu ~/.bash_profiletudo o que o Homebrew instala é encontrado primeiro. Essa é a maneira que eu o configurei no meu Mac e funcionou para mim por tanto tempo, no entanto, o YMMV.

Parece que eles acreditam que ele iria trabalhar com /usr/local/binsendo depois /usr/bin , por isso, enquanto eu poderia ter estrumado meu próprio $PATH, eu posso ver onde a sua documentação não tem:

Observe que você deve colocar /usr/local/bindepois, /usr/bin porque alguns programas esperam obter a versão do sistema, por exemplo, ruby ​​e break, se receberem a versão mais recente do Homebrew.

Da discrepância entre wiki & brew doctor # 10738 . Observe que este documento continua dizendo: "As perguntas frequentes (a citação acima) se referem à configuração PATH para aplicativos de GUI; o médico (o conselho a colocar /usr/local/binà frente /usr/bin em seu PATH) refere-se à configuração PATH para aplicativos de CLI".

Nick Klauer
fonte
1
Isso não vai deixar dois /usr/local/bins no meu $PATH? Eu acredito que sim. Gostaria de saber se deveríamos editar a ordem dos caminhos padrão /etc/pathsou o conteúdo de /etc/paths.d? Mas isso afetará todos os usuários ... talvez não seja uma coisa ruim. Enfim, só queria ver como as outras pessoas abordaram isso.
Meltemi
@Meltemi, o espírito desta resposta está correto: atualize seu PATH(da maneira que você escolher) para ter /usr/local/binprecedido /usr/bin. Eu, pessoalmente, atualizar meu PATHem .bash_profilecomo sugerido aqui.
@ Nick- informações interessantes ... e serve apenas para confundir questões (pelo menos as minhas questões) ... Os documentos do Homebrew parecem sugerir que os comandos do Terminal devem pegar os aplicativos, /usr/local/binmesmo que estejam /usr/binno caminho. Mas os aplicativos GUI precisam de coddling especial? Parece que todos os aplicativos, GUI ou não, precisam de nós para ajustar a variável $ PATH. Então, o que estou perdendo (ou os criadores do Homebrew)?
Meltemi
Acho Homebrew assume que pretende utilizar Apple fornecido executável primeiro - git é uma mudança como até Leão não foi fornecido pela Apple assim Homebrew precisava disso - agora você pode usar Apple um,
user151019
Eu concordo com Mark nisso. Com o MacPorts e o Fink, o pressuposto era fornecer um ambiente completamente novo e distinto de qualquer coisa que a Apple fornecesse imediatamente. O Homebrew assumiu a posição de que as coisas da Apple são ótimas e não evitam usá-las (por que baixar outra versão do gcc quando a Apple provavelmente fará?).
Nick Klauer
6

Eu discordo da resposta de jthomas. A edição do seu arquivo / etc / caminhos alterará os caminhos de carregamento para todos os programas. Isso pode ser perigoso se um aplicativo de sistema estiver esperando encontrar uma versão específica de um binário, mas encontrar uma versão diferente porque você editou o arquivo de caminhos. Em vez disso, altere sua variável de caminho em ~ / .bashrc (ou ~ / .bash_profile). Então o seu caminho de carga mudará apenas dentro do terminal:

# Adicionar aplicativo homebrew ao PATH
export PATH = / path / to / homebrew / app / bin: $ PATH

Em seguida, recarregue o bash ou source ~/.bashrce pronto. Como o caminho do homebrew vem antes de qualquer outra coisa, o bash carregará a versão que você baixou com o homebrew.

Nathan
fonte
No OS X, o .bashrcnão é carregado por padrão. Você o origina manualmente?
slhck
Oh sim. Eu vim do OS X do Ubuntu e estava acostumado a ter um, .bashrcentão eu o fonte do meu .bash_profile. Se você não deseja criar o arquivo rc, pode adicionar o comando ao seu .bash_profile.
Nathan
5

Pelo que entendi, brewnão coloca nada /usr/local/binque colide (tem o mesmo nome que) um executável distribuído da Apple. Portanto, ter /usr/local/bino caminho antes /bine /usr/binnão deve ser um problema, porque não deve haver colisão de nomes. * No entanto, veja os problemas com lse tar, e usando outros agregadores de pacotes como finke port(MacPorts), bem abaixo.

Brew faz uma das duas coisas que conheço que ajudam a gerenciar colisões de nomes:

  1. Brewdeixa barris não ligados na adega. Para instalar coisas, o brew deixa as ferramentas onde estão e cria links simbólicos para essas ferramentas /usr/local/bin. Para ferramentas que brewnão desejam colisão de nomes, não cria um link simbólico.
  2. Para muitas, se não todas as ferramentas padrão que também estão /bine /usr/bin, brewprefixam o link /usr/local/bincom um "g", por exemplo, para executar uma lsversão com brew, use gls. Basta fazer uma ls -lno /usr/local/bine procurar os arquivos vinculados - esses são os brewcolocou lá. Nota: As brewferramentas instaladas que devem ser acessadas por seus nomes reais são encontradas em /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

Eu não coloco /usr/local/binno meu caminho por duas razões - essas razões estão na parte inferior da minha resposta.

Para avaliar as colisões de nomes em seu sistema, use brew doctore procure esta seção - Aqui está o brew doctorresultado interessante:

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

A razão pela qual eu não coloco brewas ferramentas em primeiro lugar, de fato, é que não, porque os comandos brewinstalados lse tarnão lidam com a ACL do sistema de arquivos de fato, na última vez que verifiquei (que foi na semana passada), eles não estavam ' t tratado de todo . Esse é um problema GRANDE e, para evitá-lo por completo, junto com o manproblema de configuração de página associado que marca junto com a configuração $PATHcorreta, certifique-se de colocar as OSXferramentas relacionadas, especialmente as encontradas em /bine /usr/bin, primeiro.

Outra razão que eu nem sequer colocar /usr/local/binno meu caminho em tudo é porque brewnão joga bem com os outros, e finke port(MacPorts) têm forma mais pacotes no momento que eu preciso suportado EMPRESA . Por exemplo, eu posso começar gnome-terminalcom fink, mas seria um grande esforço para construir uma fórmula e fazer o mesmo com brew. Portanto, mantenho /swe /optem minha pesquisa $PATH(por finke port, respectivamente) e as referências de que preciso /usr/local/bin, incluindo gnat, por extenso ou uso bash alias, ou forneço um setuparquivo para um ambiente totalmente diferente ao escrever Adacódigo.

A questão é que realmente depende do que você deseja e precisa no momento.

Aqui está um exemplo do problema da ACL que mencionei acima.

Com as OSXferramentas padrão :

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

e com as brewferramentas instaladas:

$ /usr/local/bin/gls -le /var/root
/usr/local/bin/gls: invalid option -- 'e'
Try '/usr/local/bin/gls --help' for more information.

e

$ /usr/local/bin/gls --help | grep -i acl

Você obterá resultados semelhantes tare eu não conheço muitas outras brewferramentas, mas quem pode se dar ao luxo de ter algo quebrado 6 meses depois por causa de um ACLproblema!

Billy McCloskey
fonte
Obrigado pela informação útil. Como uma observação, no entanto, no meu sistema agora, tenho executáveis ​​com o mesmo nome em / usr / bin e / usr / local / bin (por exemplo, git, que é simbolizado como você observa). Então, eles entram em conflito por padrão. Também quero substituir as ferramentas do sistema para o meu trabalho de shell.
Rholmes 16/05
4

Há uma série de boas respostas aqui. Aqui está o meu:

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

Economiza a necessidade de criar um alias separado para cada programa e, como bônus, deixa as instalações padrão acessíveis, caso você precise delas.

Funciona da mesma forma se você estiver usando o ZSH; apenas mude bashrcpara zshrc. Você pode optar mypor _ou mesmo @economizar ao digitar.

Cheezmeister
fonte
2

Em vez de mexer com o PATH (que na minha história volta a me queimar meses depois), adicionei um alias para git no meu diretório de aliases personalizados do zsh (~ / .zshrc / custom / git_alias.zsh).

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

Jesse Smith
fonte
0

Prefiro limitar as alterações às variáveis ​​ambientais, como os $PATHusuários que realmente desejam a alteração. Assim, simplesmente adiciono o seguinte a ~/.bashrc:

export PATH="$(brew --prefix)/bin:$PATH"
Nils Werner
fonte
0

Você pode emitir o seguinte comando em um terminal, ele adicionará o diretório inicial do brew + o / bin no PATH do seu arquivo init do SHELL "rc" (bash, zsh, csh)

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

Apreciar !

vincedgy
fonte