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

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

A tentar configurar Homebrew num 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 git ainda mostra o do /usr/bin/git que veio com Lion (penso?). E não a do /usr/local/bin/git que acabou de ser instalada.

$ 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 se pode ver, /usr/bin não é a /usr/local/bin antes da $PATH na $PATH

Então, estou confuso! Pensei que o objectivo de HomeBrew (e algo de que os criadores parecem gabar-se) era não ter de se meter com a variável 0x6&!?!

Então, o que é que eu fiz de errado?

Respostas (9)

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

Achei este post relacionado muito útil. Em vez de alterar a variável $PATH, limita-se a editar o seu ficheiro /etc/paths. Homebrew quer que eu altere o meu PAI; não faço ideia como

Assim que segui as instruções e coloquei /usr/local/bin acima de /usr/bin, os meus problemas foram resolvidos.

  1. no OS X, abrir o Terminal
  2. Digite o comando: sudo vi /etc/paths
  3. Introduza a sua senha se lhe for pedida
  4. Verá uma lista de caminhos. Edite-os para que /usr/local/bin caminho seja introduzido acima do /usr/bin caminho
  5. *Salvar e sair
  6. Reiniciar o Terminal

Aqui está o aspecto do meu depois de ter feito isso:

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

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

Também se pode abrir o ficheiro /etc/paths num editor de texto gráfico e editá-lo dessa forma.

Crédito a fengd over em Stack Overflow para a sua resposta ali.

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

Esta resposta é obsoleta. A encomenda PATH homebrew preferida costumava ser como explicado, mas isso já não é verdade. No entanto, a abordagem é mais geralmente aplicável, por isso, por interesse, deixo-a para cima.


Não deve ser.

O homebreus mantém intencionalmente /usr/local/bin após /usr/bin no caminho para a máxima compatibilidade. Inverter a ordem destes directórios em PATH editando /etc/paths significaria que todos os programas em qualquer parte 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 ser capazes de utilizar uma versão mais recente, etc.

Como preservar este princípio e ainda assim obter a versão homebrew-instalada de git? Como diz o ditado, todos os problemas podem ser resolvidos com uma camada de indireção (excepto ter demasiadas camadas de indireção). - Ou, neste caso, como acontece, duas camadas.

Especificamente, tem sido parte dos meus hábitos Unix ter um directório ~/bin que coloquei no início do meu PATH. Esta é uma das primeiras partes do meu .bashrc:

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

Isto verifica se PATH contém ~/bin, e se não contém, prepende-o. Com isso no lugar, então selectivamente, fazer apenas o git gerido em homebraico tem precedência sobre a versão do sistema (em vez de todos os binários geridos em homebraico), e apenas para as suas sessões shell (em vez de todos os programas iniciados a partir de qualquer lugar, incluindo programas GUI), é tão simples como ligá-lo simbolicamente:

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

Você poderia fazer uma ligação simbólica /usr/local/Cellar/git/1.8.2.1/bin/git directamente, mas depois teria de corrigir a sua ligação simbólica sempre que fizesse uma ligação brew upgrade git (directa ou indirectamente). Ao fazer uma ligação simbólica ao symlink de localização fixa do homebrew, não tem de se preocupar com isso.

Então adiciona um directório ao seu $HOME para que possa adicionar o seu PATH para que possa symlink a um symlink, e isso resolve o seu problema e põe um sorriso no Dr. Seuss. Yo dawg Eu rebanho-o como symlink para que possamos colocar um caminho no seu PATH para que possa symlink enquanto symlink.

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

Não fez nada de errado, mas parece bastante claro que se tivesse /usr/local/bin no seu caminho antes de /usr/bin este problema específico desapareceria. A solução mais fácil é fazer exactamente isso e colocar algo como

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

no seu ~/.bash_profile para que tudo o que o Homebrew instala seja encontrado primeiro. É assim que o tenho instalado no meu Mac, e tem funcionado para mim durante este tempo, no entanto, YMMV.

Parece que eles acreditam que funcionaria com /usr/local/bin sendo após /usr/bin, por isso, embora eu possa ter estragado a minha própria $PATH, posso ver onde falta a sua documentação:

Note que deve colocar /usr/local/bin depois de /usr/bin porque alguns programas esperam obter a versão do sistema de, por exemplo, rubi, e quebrar se obtiverem a versão mais recente homebrew.

De Discrepância entre wiki & brew doctor #10738 .  Note que este documento continua a dizer, “The FAQ (a citação acima) refere-se à configuração PATH para aplicações GUI; o médico (o conselho para colocar /usr/local/bin à frente de /usr/bin no seu PATH) refere-se à configuração PATH para aplicações CLI”.

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

Discordo com a resposta de jthomas. A edição do seu ficheiro /etc/paths irá alterar os caminhos de carga de todos os programas. Isto pode ser perigoso se uma aplicação de sistema estiver à espera de encontrar uma versão específica de um binário mas encontrar uma versão diferente porque editou o seu ficheiro de caminhos. Em vez disso, altere a sua variável de caminho em ~/.bashrc (ou ~/.bash_profile). Então, o seu caminho de carga só mudará dentro do terminal:

Adicione a aplicação homebrew ao PATH

& > exportar PATH=/path/to/homebrew/app/bin:$PATH

Depois recarregue bash ou source ~/.bashrc, e está pronto a partir. Uma vez que o caminho homebrew vem antes de qualquer outra coisa, bash carregará a versão que descarregou com homebrew.

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

Pelo que sei, brew não coloca nada em /usr/local/bin que colida (tem o mesmo nome que) um executável distribuído pela 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 nomes. *No entanto, ver os problemas com ls e tar, e utilizando outros agregadores de pacotes como fink e port (MacPorts), muito abaixo.

Brew faz uma de duas coisas que eu sei que ajudam a gerir as colisões de nomes:

  1. Brew deixa barris sem ligação na Adega. Para instalar coisas, a cerveja deixa as ferramentas onde elas estão, e cria ligações simbólicas a essas ferramentas em /usr/local/bin. Para ferramentas com as quais brew não quer uma colisão de nome, não cria uma ligação simbólica.
  2. ** Para muitas se não todas as ferramentas padrão que também estão em /bin e /usr/bin, brew prefere o link em /usr/local/bin com um “g”, por exemplo, para executar um ls com uma versão de cerveja, use gls.** Basta fazer um ls -l em /usr/local/bin e procurar os ficheiros ligados - esses são os brew colocados lá. Nota: As ferramentas brew instaladas que devem ser acedidas pelos seus nomes reais são encontradas em /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

não ponho /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 no seu sistema, use brew doctor e procure esta secção - Aqui está o resultado de interesse do 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 não ponho as ferramentas do brew em primeiro lugar, de facto, de modo algum, é porque os comandos brew instalados ls e tar não lidam correctamente com o sistema de ficheiros ACL, de facto, da última vez que verifiquei (o que foi na semana passada), não foram tratados de todo. Este é um GRANDE problema, e para o evitar completamente, juntamente com a questão da configuração de man página associada que etiquetas juntamente com a definição do $PATH correcto, certifico-me de colocar as ferramentas relacionadas com o OSX, especialmente as encontradas em /bin e /usr/bin, em primeiro lugar.

** Outra razão pela qual nem sequer ponho /usr/local/bin no meu caminho é porque brew não joga bem com os outros, e fink e port (MacPorts) têm actualmente muito mais pacotes suportados que eu preciso 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. Assim, guardo /sw e /opt na minha pesquisa $PATH (para fink e port, respectivamente) e coisas de referência que preciso do /usr/local/bin, incluindo gnat, ou escrevo, ou utilizo bash&&, ou crio um ficheiro alias para um ambiente totalmente diferente quando escrevo setup.

A questão é que depende realmente do que se quer e do que se precisa na altura.

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

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

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

Há aqui uma série de boas respostas. Aqui está a minha:

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

Poupa-lhe a necessidade de criar um pseudónimo separado para cada programa, e como bónus deixa as instalações padrão acessíveis no caso de precisar delas.

funciona da mesma forma se estiver a usar ZSH; basta trocar bashrc por zshrc. Pode trocar my por _ ou mesmo @ para poupar na digitação.

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

Em vez de me meter com o PATH de todo (que na minha história volta para me queimar meses depois) adicionei um pseudónimo para git no meu directório de pseudónimos personalizados zsh (~/.zshrc/custom/git_alias.zsh).

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

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

Pode emitir o seguinte comando num terminal, ele adicionará o directório da cerveja + a /bin no PATH do seu ficheiro init SHELL “rc” (bash, zsh, csh)

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

Desfrute !

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

Prefiro limitar as alterações a variáveis ambientais como $PATH a utilizadores que realmente querem a mudança. Assim, simplesmente acrescento o seguinte ao ~/.bashrc:

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