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

79

Tentando configurar o Homebrew em um novo Mac (nos Macs anteriores eu instalaria pacotes do código-fonte).

O primeiro pacote que tentei instalar foi o Git:

$ brew install git

A instalação foi OK, mas which git ainda mostra o em /usr/bin/git que veio junto com Lion (eu acho?). E não aquele em /usr/local/bin/git que 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, o /usr/bin é padronizado antes de /usr/local/bin no $PATH

Estou confuso! Eu pensei que o ponto de HomeBrew (e algo que os criadores parecem se gabar) era que você não tem que mexer com a variável $PATH !?!

Então, o que fiz de errado?

    
por Meltemi 17.08.2011 / 21:36

9 respostas

73

Eu achei essa postagem relacionada muito útil. Em vez de alterar a variável $PATH , basta editar o arquivo /etc/paths .

Homebrew quer que eu corrija meu PATH; nenhuma pista de como

Assim que segui as instruções e coloquei /usr/local/bin acima de /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 /usr/local/bin path seja inserido acima do /usr/bin path
  5. * Salvar e sair
  6. Reiniciar terminal

Veja como é a minha depois de fazer isso:

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

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

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

Crédito para fengd no Stack Overflow por sua resposta ali.

    
por 13.01.2013 / 23:35
28

Esta resposta é obsoleta. A ordem preferida de Homebrew PATH costumava ser explicada, mas isso não é mais verdade. No entanto, a abordagem é mais geralmente aplicável, por isso, pelo interesse, estou deixando de lado.

Você não deveria.

O Homebrew intencionalmente mantém /usr/local/bin após /usr/bin no caminho para compatibilidade máxima. Inverter a ordem desses diretórios em PATH editando /etc/paths significaria que todos programas em qualquer lugar do sistema, independentemente de como foram iniciados, receberão a versão Homebrew de um comando. Mas alguns podem especificamente esperar a versão da Apple, ou simplesmente não ser capaz de usar uma versão mais nova, etc.

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

Especificamente, faz parte dos meus hábitos Unix ter um diretório ~/bin , 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 PATH contém ~/bin e, se não, o preende. Com isso, então, seletivamente, apenas o git gerenciado pelo Homebrew tem precedência sobre a versão do sistema (em vez de todo binário gerenciado pelo Homebrew), e apenas para as sessões do shell (em vez de todos os programas iniciados de qualquer lugar, incluindo programas GUI), é tão simples quanto criar links simbólicos:

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

Você poderia fazer um link simbólico de /usr/local/Cellar/git/1.8.2.1/bin/git diretamente, mas então você teria que consertar seu symlink toda vez que você fizesse um brew upgrade git (direta ou indiretamente). Ao criar um link simbólico para o link simbólico de localização fixa do Homebrew, você não precisa se preocupar com isso.

Então você adiciona um diretório ao seu $HOME , então você pode adicionar o seu PATH para que você possa ligar simbolicamente a um link simbólico, e isso resolve o problema e coloca um sorriso no Dr Seuss. Yo dawg eu rebanho você como links simbólicos, então colocamos um caminho no seu PATH para que você possa ligar simbolicamente enquanto você liga simbolicamente.

    
por 10.04.2013 / 01:28
16

Você não fez nada de errado, mas parece bem claro que se você tivesse /usr/local/bin em seu caminho antes de /usr/bin este problema específico desapareceria. A solução mais fácil é fazer exatamente isso e colocar algo como

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

no seu ~/.bash_profile , então tudo que o Homebrew instala é encontrado primeiro. É assim que eu o configurei no meu Mac, e isso funcionou para mim por tanto tempo, no entanto, YMMV.

Parece que eles acreditam que funcionaria com /usr/local/bin sendo após /usr/bin , então, embora eu possa ter destruído meu próprio $PATH , posso ver onde falta a documentação deles:

Note that you should put /usr/local/bin after /usr/bin because some programs will expect to get the system version of, e.g., ruby, and break if they get the newer Homebrew version.

De Discrepância entre wiki & brew doctor # 10738 . Note que este documento continua dizendo: "O FAQ (a citação acima) refere-se à configuração PATH para aplicativos GUI; o médico (o conselho para colocar /usr/local/bin à frente de /usr/bin no seu PATH) refere-se à configuração PATH para aplicativos CLI. "

    
por 17.08.2011 / 21:42
6

Eu não concordo com a resposta dos jthomas. A edição do seu arquivo / etc / paths mudará os caminhos de carga para todos os programas. Isso pode ser perigoso se um aplicativo do 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 só irá mudar dentro do terminal:

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

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

    
por 03.04.2013 / 21:28
5

Pelo que entendi, brew não coloca nada em /usr/local/bin que colida (tem o mesmo nome de) um executável distribuído da Apple. Portanto, ter /usr/local/bin no caminho antes de /bin e /usr/bin não deve ser um problema, porque não deve haver colisões de nome. * No entanto, veja os problemas com ls e tar e use outros agregadores de pacotes como fink e port (MacPorts), muito abaixo.

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

  1. Brew deixa barris desvinculados na Adega. Para instalar coisas, o brew deixa as ferramentas onde estão e cria links simbólicos para essas ferramentas em /usr/local/bin . Para ferramentas com as quais brew não quer uma colisão de nomes, ela não cria um link simbólico.
  2. Para muitas, se não todas, as ferramentas padrão que também estão em /bin e /usr/bin , brew prefixam o link em /usr/local/bin com um "g", por exemplo, para executar um ls com uma versão brew, use gls . Basta fazer um ls -l em /usr/local/bin e procurar os arquivos vinculados - esses são aqueles brew colocados lá. Nota: As ferramentas brew 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/bin no meu caminho por duas razões - essas razões estão no fundo da minha resposta.

Para avaliar as colisões de nomes em seu sistema, use brew doctor e procure por esta seção - Aqui está a saída de interesse de 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

A razão pela qual eu não coloco as ferramentas brew primeiro, na verdade, não é, porque os comandos brew installed ls e tar não manipulam a ACL do sistema de arquivos corretamente , na verdade, da última vez que verifiquei (que foi na semana passada), eles não foram tratados em todos os . Este é um grande problema, e para evitá-lo completamente, juntamente com o problema associado à configuração da página man que marca junto com a definição do $PATH , eu coloco as ferramentas relacionadas OSX , especialmente aquelas encontradas em /bin e /usr/bin , primeiro.

Outra razão pela qual eu nem coloquei /usr/local/bin no meu caminho é porque brew não joga bem com os outros, e fink e port (MacPorts) têm muito mais suporte pacotes no momento que eu preciso de NOW . Por exemplo, posso obter gnome-terminal com fink , mas seria um grande esforço construir uma fórmula e fazer o mesmo com brew . Então, eu mantenho /sw e /opt na minha pesquisa $PATH (para fink e port , respectivamente) e coisas de referência que eu preciso de /usr/local/bin , incluindo gnat , ou soletrado, ou eu use bash alias , ou eu forneço um arquivo setup para um ambiente completamente diferente quando escrevo Ada code.

O problema é que realmente depende do que você quer e precisa no momento.

Veja um exemplo do problema da ACL que mencionei acima.

Com as ferramentas OSX 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 ferramentas brew 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 com tar e não conheço muitas outras ferramentas brew , mas quem pode se dar ao luxo de quebrar algo por 6 meses, devido a um problema ACL !

    
por 03.01.2014 / 23:07
4

Há muitas respostas boas 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; basta mudar bashrc para zshrc . Você pode trocar my por _ ou mesmo @ para economizar na digitação.

    
por 18.09.2014 / 22:46
2

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

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

    
por 30.07.2013 / 20:47
0

Eu prefiro limitar as alterações às variáveis do ambiente, como $PATH , aos usuários que realmente desejam a alteração. Assim, eu simplesmente adiciono o seguinte a ~/.bashrc :

export PATH="$(brew --prefix)/bin:$PATH"
    
por 21.03.2014 / 12:54
0

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

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

Aproveite!

    
por 23.05.2017 / 19:29