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

Come devo impostare la variabile PATH sul mio Mac in modo che gli strumenti installati da Hombrew vengano trovati?

Sto cercando di impostare Homebrew su un nuovo Mac (sui Mac precedenti installavo i pacchetti dai sorgenti).

Il primo pacchetto che ho provato a installare è stato Git:

$ brew install git

L'installazione è andata bene, ma which git mostra ancora quello in /usr/bin/git che è arrivato insieme a Lion (credo?). E non quello in /usr/local/bin/git che è stato appena installato.

$ 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

Come puoi vedere /usr/bin ha un default che precede /usr/local/bin nel $PATH

Quindi, sono confuso! Pensavo che il punto di HomeBrew (e qualcosa di cui i creatori sembrano vantarsi) fosse che non si deve fare casino con la variabile $PATH!?!

Quindi, cosa ho fatto di sbagliato?

Risposte (9)

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

Ho trovato questo post correlato molto utile. Invece di cambiare la variabile $PATH, ti fa semplicemente modificare il tuo file /etc/paths. Homebrew vuole che modifichi il mio PATH; non ho idea di come

Appena ho seguito le indicazioni e messo /usr/local/bin sopra /usr/bin, i miei problemi sono stati risolti.

  1. Su OS X, apri il Terminale
  2. Digitare il comando: sudo vi /etc/paths
  3. Inserisci la tua password se ti viene chiesta
  4. Vedrai una lista di percorsi. Modificali in modo che il percorso /usr/local/bin sia inserito sopra il percorso /usr/bin
  5. *Salvare e uscire
  6. Riavvia il terminale

Ecco come appare il mio dopo averlo fatto:

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

*Per salvare e uscire digita due punti (:), poi digita wq (per scrivere e uscire allo stesso tempo), seguito da Invio.

Puoi anche aprire il file /etc/paths in un editor di testo grafico e modificarlo in quel modo.

Credito a fengd su Stack Overflow per la sua risposta.

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

Questa risposta è obsoleta. L'ordinamento Homebrew PATH preferito era quello spiegato, ma non è più vero. Tuttavia, l'approccio è più generalmente applicabile, quindi per il bene dell'interesse, lo lascio su.


Non dovresti.

Homebrew tiene intenzionalmente /usr/local/bin dopo /usr/bin nel percorso per la massima compatibilità. Invertire l'ordine di queste directory in PATH modificando /etc/paths significherebbe che tutti i programmi ovunque sul sistema, non importa come siano stati avviati, otterranno la versione Homebrew di un comando. Ma alcuni potrebbero aspettarsi specificamente la versione di Apple, o semplicemente non essere in grado di usare una versione più recente, ecc.

Come preservare questo principio e ottenere comunque la versione Homebrew installata di git? Come dice il proverbio, tutti i problemi possono essere risolti con un livello di indirettezza (tranne avere troppi livelli di indirettezza). - O in questo caso, come si è scoperto, due strati.

Nello specifico, fa parte delle mie abitudini Unix avere una directory ~/bin che metto all'inizio del mio PATH. Questo è uno dei primi bit del mio .bashrc:

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

Questo controlla se PATH contiene ~/bin, e se no, lo aggiunge. Con questo a posto, allora fare selettivamente in modo che solo lo git gestito da Homebrew abbia la precedenza sulla versione di sistema (invece di tutti i binari gestiti da Homebrew), e solo per le vostre sessioni di shell (invece di tutti i programmi avviati da qualsiasi parte, inclusi i programmi GUI), è semplice come fare un link simbolico:

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

Si potrebbe linkare direttamente /usr/local/Cellar/git/1.8.2.1/bin/git, ma poi si dovrebbe sistemare il link simbolico ogni volta che si fa un brew upgrade git (direttamente o indirettamente). Facendo un link simbolico al link simbolico a posizione fissa di Homebrew, non dovrete preoccuparvene.

Quindi aggiungi una directory al tuo $HOME in modo da poterlo aggiungere al tuo PATH in modo da poter fare un link simbolico, e questo risolve il tuo problema e fa sorridere il Dr Seuss. Yo dawg I herd you like symlinks so we put a path in your PATH so you can symlink while you symlink.

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

Non hai fatto nulla di sbagliato, ma sembra abbastanza chiaro che se tu avessi /usr/local/bin nel tuo percorso prima di /usr/bin questo specifico problema andrebbe via. La soluzione più semplice è fare proprio questo e mettere qualcosa come

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

nel tuo ~/.bash_profile così tutto ciò che Homebrew installa viene trovato per primo. Questo è il modo in cui l'ho impostato sul mio Mac, e ha funzionato per me per tutto questo tempo, tuttavia, YMMV.

Sembra che loro credano che funzionerebbe con /usr/local/bin che è dopo /usr/bin, così mentre io potrei aver incasinato il mio $PATH, posso vedere dove la loro documentazione manca:

Nota che dovresti mettere /usr/local/bin dopo /usr/bin perché alcuni programmi si aspettano di ottenere la versione di sistema di, per esempio, ruby, e si rompono se ottengono la versione Homebrew più recente.

Da Discrepancy between wiki & brew doctor #10738 .  Nota che questo documento continua dicendo, “Le FAQ (la citazione sopra) si riferisce all'impostazione PATH per le applicazioni GUI; il dottore (il consiglio di mettere /usr/local/bin prima di /usr/bin nel tuo PATH) si riferisce all'impostazione PATH per le applicazioni CLI.”

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

Non sono d'accordo con la risposta di jthomas. La modifica del vostro file /etc/paths cambierà i percorsi di caricamento per tutti i programmi. Questo potrebbe essere pericoloso se un'applicazione di sistema si aspetta di trovare una versione specifica di un binario ma trova una versione diversa perché hai modificato il tuo file dei percorsi. Invece, cambia la tua variabile di percorso in ~/.bashrc (o ~/.bash\profile). Allora il tuo percorso di caricamento cambierà solo all'interno del terminale:

Aggiungi l'app homebrew a PATH

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

Poi ricarica bash o source ~/.bashrc, e sei pronto a partire. Poiché il percorso homebrew viene prima di qualsiasi altra cosa, bash caricherà la versione che hai scaricato con homebrew.

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

Da quanto ho capito, brew non mette nulla in /usr/local/bin che collida (ha lo stesso nome di) un eseguibile distribuito da Apple. Quindi, avere /usr/local/bin nel percorso prima di /bin e /usr/bin non dovrebbe essere un problema, perché non dovrebbero esserci collisioni di nomi. *Comunque, vedi i problemi con ls e tar, e l'uso di altri aggregatori di pacchetti come fink e port (MacPorts), più avanti.

Brew fa una delle due cose che conosco che aiutano a gestire le collisioni dei nomi:

  1. Brew lascia i fusti non collegati in cantina. Per installare roba, brew lascia gli strumenti dove sono, e crea collegamenti simbolici a quegli strumenti in /usr/local/bin. Per gli strumenti con cui brew non vuole una collisione di nome, non crea un link simbolico.
  2. Per molti, se non tutti i tool standard che sono anche in /bin e /usr/bin, brew fa precedere il link in /usr/local/bin da una “g”, così per esempio, per eseguire un ls con una versione brew, usa gls. Fai semplicemente un ls -l in /usr/local/bin e cerca i file collegati - sono quelli che brew ha messo lì. Nota: Gli strumenti installati da brew che devono essere accessibili con i loro veri nomi si trovano in /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

Non metto /usr/local/bin nel mio percorso per due ragioni - queste ragioni sono in fondo alla mia risposta.

Per valutare le collisioni di nomi nel tuo sistema, usa brew doctor e cerca questa sezione - Ecco l'output di brew doctor di interesse:

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

La ragione per cui non metto gli strumenti di brew per primi, anzi, per niente, è che i comandi brew installati ls e tar non gestiscono correttamente l'ACL del filesystem, infatti, l'ultima volta che ho controllato (che era la settimana scorsa), non venivano gestiti affatto. Questo è un GROSSO problema, e per evitarlo del tutto, insieme al problema associato alla configurazione della pagina man che accompagna l'impostazione corretta di $PATH, mi assicuro di mettere gli strumenti relativi a OSX, specialmente quelli che si trovano in /bin e /usr/bin, per primi.

Un'altra ragione per cui non metto affatto /usr/local/bin nel mio percorso è che brew non gioca bene con altri, e fink e port (MacPorts) hanno molti più pacchetti supportati al momento di cui ho bisogno NOW. Per esempio, posso ottenere gnome-terminal con fink, ma sarebbe un grande sforzo costruire una formula e fare lo stesso con brew. Così, tengo /sw e /opt nella mia ricerca $PATH (per fink e port, rispettivamente) e faccio riferimento alle cose che mi servono da /usr/local/bin, incluso gnat, o lo spelling, o uso bash alias‘s, o faccio il source di un file setup per un ambiente completamente diverso quando scrivo codice Ada.

Il fatto è che dipende davvero da quello che vuoi e di cui hai bisogno in quel momento.

Ecco un esempio del problema ACL che ho menzionato sopra.

Con gli strumenti standard 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

e con gli strumenti installati brew:

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

Otterrai risultati simili con tar e non conosco a casa molti altri strumenti brew, ma chi può permettersi che qualcosa si rompa 6 mesi dopo per un problema ACL!

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

C'è tutta una serie di buone risposte qui. Ecco la mia:

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

Ti evita di dover creare un alias separato per ogni programma, e come bonus lascia le installazioni di default accessibili nel caso tu ne abbia bisogno.

Funziona allo stesso modo se stai usando ZSH; basta sostituire bashrc con zshrc. Puoi sostituire my con _ o anche @ per risparmiare sulla digitazione.

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

Piuttosto che pasticciare con il PATH (che nella mia storia torna a bruciarmi mesi dopo) ho aggiunto un alias per git nella mia directory degli alias personalizzati di zsh (~/.zshrc/custom/git_alias.zsh).

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

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

Puoi lanciare il seguente comando in un terminale, aggiungerà la home directory di brew + la /bin nel PATH del tuo qualsiasi file di init SHELL “rc” (bash, zsh, csh)

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

Enjoy !

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

Preferisco limitare le modifiche alle variabili environvent come $PATH agli utenti che vogliono effettivamente la modifica. Così, aggiungo semplicemente quanto segue a ~/.bashrc:

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