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


86

Cercando di configurare Homebrew su un nuovo Mac (sui Mac precedenti avrei installato i pacchetti dal sorgente).

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

$ brew install git

L'installazione è andata bene, ma which gitmostra ancora quello /usr/bin/gitche è arrivato insieme a Lion (penso?). E non quello /usr/local/bin/gitche è 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 le /usr/binimpostazioni predefinite di prima /usr/local/binin$PATH

Quindi sono confuso! Ho pensato che il punto di HomeBrew (e qualcosa di cui i creatori sembrano vantarsi) fosse che non devi fare confusione con la $PATHvariabile!?!

Quindi, cosa ho fatto di sbagliato?


hai incasinato il tuo percorso in precedenza e forse li hai messi nell'ordine sbagliato? Inoltre non sono sicuro del motivo per cui questo è un "punto di vanto" da homebrew ... non piace il concetto di un percorso o modificarlo è una cosa complessa che comporta la creazione e l'irrorazione di 10 diverse pianificazioni nel sistema con autorizzazioni speciali o qualcosa del genere. ..
prodigitalson

1
percorso, anche la parte che non è correlata alla RVM, dovrebbe essere un problema standard. E no, non mi lamento di dover cambiare il percorso. È solo che sembrano ripetere l'affermazione secondo If you choose /usr/local, everything 'just works!'cui devo chiedermi cosa mi sto perdendo ... perché non "funziona".
Meltemi,

Risposte:


78

Ho trovato questo post correlato molto utile. Invece di cambiare la $PATHvariabile, devi semplicemente modificare il tuo /etc/pathsfile.

Homebrew vuole che modifichi il mio PERCORSO; nessun indizio come

Non appena ho seguito le indicazioni e messo /usr/local/binsopra /usr/bin, i miei problemi sono stati risolti.

  1. Su OS X, apri Terminale
  2. Digita il comando: sudo vi /etc/paths
  3. Inserisci la tua password se ti viene richiesta
  4. Vedrai un elenco di percorsi. Modificali in modo che il /usr/local/binpercorso sia inserito sopra il /usr/binpercorso
  5. *Salva ed esci
  6. Riavvia terminale

Ecco come appare il mio dopo averlo fatto:

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

* Per salvare ed uscire digitare due punti ( :), quindi digitare wq(per scrivere ed uscire contemporaneamente), seguito da Enter.

Puoi anche aprire il /etc/pathsfile in un editor di testo grafico e modificarlo in questo modo.

Ringraziamo di trovare Stack Overflow per la sua risposta laggiù.


Poiché vi dimwits (come me) usate d per tagliare una linea e p per incollarla in modalità comando
Gerard

10
Vorrei fare attenzione con questo: la risposta migliore è semplicemente modificare il percorso in .profile / .bash_profile ed esportarlo lì. Modificando / etc / percorsi, si influenza (potenzialmente) tutti i processi di sistema; la modifica del PERCORSO in .profile / .bash_profile localizza la preferenza sia per il tuo account sia per quei comandi invocati tramite la shell dei comandi (che, nel mio caso di sviluppo, è ciò che voglio). Se sei davvero cauto, puoi fare ciò che @Aristotle Pagaltzis suggerisce nella risposta qui sotto.
rholmes,

1
C'è qualche punto in cui ti fermi a considerare che c'è qualcosa di terribilmente sbagliato che una semplice installazione da un gestore di pacchetti progettata per OSX non stia funzionando? Cambiare il tuo percorso è una "correzione" potenzialmente pericolosa e BTW, il motivo per cui mi sono imbattuto in questa correzione proposta è che anche brew non aggiorna il mio percorso, ma "percorsi" è già nell'ordine corretto. Un altro vicolo cieco. Ferma la follia, risolvi la causa principale.
Rick O'Shea,

Inoltre, c'è path_helpere /etc/paths.d.
Simon Wright,

29

Questa risposta è obsoleta. L' PATHordinamento Homebrew preferito era come spiegato, ma non è più vero. Tuttavia, l'approccio è più in generale applicabile, quindi per motivi di interesse, lo sto abbandonando.


Non dovresti.

Homebrew mantiene intenzionalmente /usr/local/bin dopo /usr/bin nel percorso per la massima compatibilità. Invertire l'ordine di queste directory PATHcon la modifica /etc/pathssignificherebbe che tutti i programmi in qualsiasi parte del sistema, indipendentemente da come sono 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 utilizzare una versione più recente, ecc.

Come conservare questo principio e ottenere ancora la versione di Homebrew installata git? Come dice il proverbio, tutti i problemi possono essere risolti con uno strato di riferimento indiretto (tranne che con troppi livelli di riferimento indiretto). - O in questo caso, a quanto pare, due strati.

In particolare, è stato parte delle mie abitudini Unix avere una ~/bindirectory che ho messo all'inizio della mia PATH. Questo è uno dei primi bit nel mio .bashrc:

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

Controlla se lo PATHcontiene ~/bine, in caso contrario, lo antepone. Con quello in atto, quindi fare in modo che solo il gestito da Homebrew gitabbia la precedenza sulla versione del sistema (invece di ogni binario gestito da Homebrew), e solo per le sessioni della shell (invece di tutti i programmi avviati da qualsiasi luogo, inclusi i programmi della GUI), è semplice come link simbolico:

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

È possibile collegare /usr/local/Cellar/git/1.8.2.1/bin/gitdirettamente il collegamento simbolico , ma è necessario correggere il collegamento simbolico ogni volta che si esegue un collegamento brew upgrade git(diretto o indiretto). Collegando il collegamento simbolico al collegamento simbolico di Homebrew a posizione fissa, non devi preoccuparti.

Quindi aggiungi una directory alla tua in $HOMEmodo da poterla aggiungere in PATHmodo da poter ricollegare a un symlink e questo risolve il tuo problema e fa sorridere il dottor Seuss. Yo dawg Ti ho fatto seguire i PATHlink simbolici, quindi ti inseriamo un percorso per consentirti di connetterti mentre esegui il link simbolico.


1
Eccellente, questo risponde esattamente a ciò che mi chiedevo!
N_A,

Questo sembra la risposta giusta, ma non riesco a capire i comandi esatti da eseguire. Continuo a ricevere "Il file esiste" durante la creazione di collegamenti simbolici.
Ryan,

Spiacenti, dettagli insufficienti per aiutarti.
Aristotele Pagaltzis,

1
@Ryan assicurati di avere l'ordine di args proprio nel lncomando. Il primo percorso è il bersaglio, e il secondo è il
collegamento

1
è vero che, su el cap, ho fallito con la risposta obsoleta e sono riuscito con (uso ZSH) a modificare l'ordine del percorso in .zshrcexport PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Urs

17

Non hai fatto nulla di male, ma sembra abbastanza chiaro che se avessi /usr/local/binsul tuo cammino prima di /usr/binquesto specifico problema andrebbe via. La soluzione più semplice è fare proprio questo e mettere qualcosa del genere

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

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

Sembra che credano che avrebbe funzionato con l' /usr/local/binessere dopo /usr/bin , quindi mentre potrei aver inventato la mia $PATH, posso vedere dove manca la loro documentazione:

Nota che dovresti metterlo /usr/local/bindopo /usr/bin perché alcuni programmi si aspettano di ottenere la versione del sistema, ad esempio ruby, e si rompono se ottengono la nuova versione di Homebrew.

Dalla discrepanza tra wiki e brew doctor # 10738 . Nota che questo documento prosegue dicendo "Le FAQ (la citazione sopra) si riferiscono all'impostazione del PERCORSO per le app GUI; il medico (i consigli da /usr/local/binanticipare /usr/bin nel tuo PERCORSO) si riferisce all'impostazione del PERCORSO per le app della CLI".


1
Questo non lascerà due /usr/local/binsecondi nel mio $PATH? Credo di sì. Mi chiedo se dovremmo invece modificare l'ordine dei percorsi predefiniti /etc/pathso il contenuto di /etc/paths.d? Ma questo influenzerà ogni utente ... forse non è una brutta cosa. Ad ogni modo, volevo solo vedere come le altre persone si sono avvicinate a questo.
Meltemi,

@Meltemi, lo spirito di questa risposta è corretto: aggiorna il tuo PATH(nel modo che preferisci ) per avere la /usr/local/binprecedenza /usr/bin. Personalmente aggiorno il mio PATHin .bash_profilecome suggerito qui.

@ Nick- informazioni interessanti ... e serve solo a confondere le cose (almeno le mie questioni) ... I documenti Homebrew sembrano implicare che i comandi di Terminale dovrebbero raccogliere le app /usr/local/binanche se si insinuano /usr/binnel percorso. Ma le app della GUI necessitano di coddling speciale? Sembrerebbe che tutte le app, GUI o meno, abbiano bisogno di noi per adattare la variabile $ PATH. Quindi, cosa mi manca (o i creatori di Homebrew)?
Meltemi,

Penso che Homebrew presuma che tu voglia usare prima l'eseguibile fornito da Apple - git è un cambiamento poiché fino a quando Lion non è stato fornito da Apple, quindi Homebrew ne ha avuto bisogno - ora puoi usare quello Apple,
user151019

Sono d'accordo con Mark su questo. Con MacPorts e Fink, il presupposto era quello di fornire un ambiente completamente incontaminato e separato da tutto ciò che Apple ha fornito immediatamente. Homebrew ha preso la posizione che le cose di Apple sono fantastiche e non per evitare di usarle (perché scaricare un'altra versione di gcc quando probabilmente lo farà Apple?).
Nick Klauer,

6

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

# Aggiungi l'app homebrew
all'esportazione PATH PATH = / path / to / homebrew / app / bin: $ PATH

Quindi ricaricare bash o source ~/.bashrc, e sei a posto. Poiché il percorso homebrew viene prima di ogni altra cosa, bash caricherà la versione che hai scaricato con homebrew.


In OS X, .bashrcnon viene caricato per impostazione predefinita. Lo procedi manualmente?
Slhck,

O si. Vengo da OS X da Ubuntu ed ero abituato ad avere un .bashrccosì lo fonte dal mio .bash_profile. Se non si desidera creare il file rc, è possibile aggiungere il comando al proprio .bash_profile.
Nathan,

5

A quanto ho capito, brewnon inserisce nulla in /usr/local/bincui si scontra (ha lo stesso nome di) un eseguibile distribuito da Apple. Pertanto, avere /usr/local/binnel percorso prima /bine /usr/binnon dovrebbe essere un problema, perché non dovrebbero esserci collisioni di nomi. * Tuttavia, vedi i problemi con lse tar, e usando altri aggregatori di pacchetti come finke port(MacPorts), molto sotto.

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

  1. Brewlascia fusti non collegati nella Cantina. Per installare roba, brew lascia gli strumenti dove sono e crea collegamenti simbolici a quegli strumenti /usr/local/bin. Per gli strumenti che brewnon vogliono una collisione del nome, non crea un collegamento simbolico.
  2. Per molti, se non tutti, gli strumenti standard che sono anche in /bine /usr/bin, brewantepongono il collegamento /usr/local/bincon una "g", quindi ad esempio per eseguire una lsversione brew, utilizzare gls. Basta fare un ls -lin /usr/local/bine cercare i file collegati: quelli sono quelli brewmessi lì. Nota: gli brewstrumenti installati a cui è necessario accedere con i loro nomi reali si trovano in /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

Non metto la /usr/local/binmia strada per due ragioni: quelle ragioni sono in fondo alla mia risposta.

Per valutare le collisioni di nomi nel tuo sistema, usa brew doctore cerca questa sezione - Ecco l' brew doctoroutput 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

Il motivo per cui non metto brewprima gli strumenti, in realtà, per niente, è perché i comandi brewinstallati lse tarnon gestiscono correttamente il file system ACL, infatti l'ultima volta che ho controllato (che era la scorsa settimana), non lo erano " t gestito a tutti . Questo è un GRANDE problema, e per evitarlo del tutto, insieme al manproblema di configurazione della pagina associato che tagga insieme all'impostazione del $PATHgiusto, mi assicuro di mettere gli OSXstrumenti correlati, specialmente quelli trovati in /bine /usr/bin, prima.

Un altro motivo per cui non ho nemmeno messo /usr/local/binsul mio percorso è perché brewnon gioca bene con gli altri e finke port(MacPorts) hanno attualmente molti più pacchetti supportati di cui ho bisogno ADESSO . Per esempio, posso ottenere gnome-terminalcon fink, ma sarebbe un grande sforzo per costruire una formula e fare lo stesso con brew. Quindi, conservo /swe /optnella mia ricerca $PATH( rispettivamente per finke port, rispettivamente) e riferimento alle cose di cui ho bisogno /usr/local/bin, tra cui gnat, sia esplicitato, o uso bash aliasdi, o fonte un setupfile per un ambiente completamente diverso quando scrivo il Adacodice.

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

Ecco un esempio del problema ACL che ho menzionato sopra.

Con gli OSXstrumenti standard :

$ /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 brewstrumenti installati:

$ /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 tare non conosco molti altri brewstrumenti a casa, ma chi può permettersi di fare qualcosa per 6 mesi lungo la strada a causa di un ACLproblema!


Grazie per le informazioni utili. Come nota, tuttavia, sul mio sistema in questo momento, ho degli eseguibili con lo stesso nome in entrambi / usr / bin e / usr / local / bin (ad esempio, git, che è il link simbolico, come notate). Quindi, sono in conflitto per impostazione predefinita. Voglio anche sovrascrivere gli strumenti di sistema per il mio lavoro di shell.
rholmes,

4

C'è tutta una serie di buone risposte qui. Ecco il mio:

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 ciascun programma e, come bonus, rende accessibili le installazioni predefinite nel caso ne avessi bisogno.

Funziona allo stesso modo se stai usando ZSH; basta passare bashrcper zshrc. È possibile passare fuori myper _o anche @per risparmiare sulla tipizzazione.


2

Invece di fare casini con il PERCORSO (che nella mia storia torna a bruciarmi mesi dopo) ho aggiunto un alias per git nella mia directory di alias personalizzati zsh (~ / .zshrc / custom / git_alias.zsh).

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


0

Preferisco limitare le modifiche alle variabili di ambiente come $PATHagli utenti che desiderano effettivamente la modifica. Pertanto, aggiungo semplicemente quanto segue a ~/.bashrc:

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

0

È possibile emettere il seguente comando in un terminale, aggiungerà la home directory brew + il / bin nel PERCORSO del file init SHELL "rc" (bash, zsh, csh)

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

Godere !

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.