Wie soll ich die PATH-Variable auf meinem Mac einstellen, damit die von Hombrew installierten Tools gefunden werden?


86

Beim Versuch, Homebrew auf einem neuen Mac einzurichten (auf früheren Macs installierte ich Pakete aus dem Quellcode).

Das erste Paket, das ich installieren wollte, war Git:

$ brew install git

Die Installation ging in Ordnung, which gitzeigt aber immer noch die /usr/bin/git, die mit Lion geliefert wurde (glaube ich?). Und nicht der /usr/local/bin/git, der gerade installiert wurde.

$ 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

Wie Sie sehen können, sind die /usr/binStandardeinstellungen /usr/local/binin der$PATH

Also bin ich verwirrt! Ich dachte, der Sinn von HomeBrew (und etwas, womit die Schöpfer zu prahlen scheinen) ist, dass Sie sich nicht mit der $PATHVariablen anlegen müssen !?!

Also, was habe ich falsch gemacht?


Hast du dich vorher mit deinem Weg herumgeschlagen und sie vielleicht in die falsche Reihenfolge gebracht? Ich bin mir auch nicht sicher, warum dies eine "prahlerische" Form von Homebrew ist ... es mag nicht das Konzept eines Pfades, oder es zu modifizieren ist eine komplexe Sache, bei der 10 verschiedene Plists auf Ihrem System mit speziellen Berechtigungen oder etwas anderem erstellt und besprüht werden. ..
Wunderkind

1
path, also der Teil, der nicht mit RVM zusammenhängt, sollte das Standardproblem sein. Und nein, ich beschwere mich nicht, dass ich den Weg ändern muss. Es ist nur so, dass sie die Behauptung zu wiederholen scheinen, If you choose /usr/local, everything 'just works!'dass ich mich fragen muss, was ich vermisse ... weil es nicht "nur funktioniert".
Meltemi

Antworten:


78

Ich fand diesen verwandten Beitrag sehr hilfreich. Anstatt die $PATHVariable zu ändern , müssen Sie lediglich Ihre /etc/pathsDatei bearbeiten .

Homebrew möchte, dass ich meinen PFAD ändere. keine ahnung wie

Sobald ich den Anweisungen gefolgt und /usr/local/binoben angegeben hatte /usr/bin, waren meine Probleme gelöst.

  1. Öffnen Sie unter OS X Terminal
  2. Geben Sie den Befehl ein: sudo vi /etc/paths
  3. Geben Sie Ihr Passwort ein, wenn Sie danach gefragt werden
  4. Sie sehen eine Liste der Pfade. Bearbeiten Sie sie so, dass der /usr/local/binPfad über dem /usr/binPfad eingegeben wird
  5. *Speichern und Beenden
  6. Terminal neu starten

So sieht meins aus, nachdem ich das getan habe:

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

* Um zu speichern und zu beenden, geben Sie einen Doppelpunkt ( :) ein und dann wq(um gleichzeitig zu schreiben und zu beenden), gefolgt von Enter.

Sie können die /etc/pathsDatei auch in einem grafischen Texteditor öffnen und auf diese Weise bearbeiten.

Kredit fengd für seine Antwort auf Stack - Überlauf über drüben.


Für vi dimwits (wie ich) verwenden Sie d, um eine Linie auszuschneiden und p, um sie im Befehlsmodus einzufügen
Gerard

10
Ich würde hier mit Vorsicht vorgehen - die bessere Antwort ist, einfach den Pfad in .profile / .bash_profile zu ändern und dort zu exportieren. Indem Sie / etc / path ändern, wirken Sie sich (möglicherweise) auf alle Systemprozesse aus. Durch Ändern von PATH in .profile / .bash_profile werden die Einstellungen sowohl für Ihr Konto als auch für die über die Befehls-Shell aufgerufenen Befehle lokalisiert (was in meinem Fall für die Entwicklung das ist, was ich möchte). Wenn Sie wirklich vorsichtig sind, können Sie das tun, was @Aristoteles Pagaltzis in der Antwort unten vorschlägt.
Stockholm

1
Gibt es irgendwann einen Punkt, an dem Sie nicht mehr bedenken, dass eine einfache Installation von einem für OSX entwickelten Paket-Manager nicht sofort funktioniert? Das Ändern Ihres Pfads ist ein potenziell problematischer "Fix". Der Grund, warum ich auf diesen vorgeschlagenen Fix gestoßen bin, ist, dass mein Pfad nicht aktualisiert werden kann, aber "Pfade" bereits in der richtigen Reihenfolge sind. Noch eine Sackgasse. Stoppen Sie den Wahnsinn, beheben Sie die Ursache.
Rick O'Shea

Es gibt auch path_helperund /etc/paths.d.
Simon Wright

29

Diese Antwort ist veraltet. Die bevorzugte Homebrew- PATHReihenfolge war früher wie beschrieben, aber das stimmt nicht mehr. Der Ansatz ist jedoch allgemeiner anwendbar. Aus Gründen des Interesses lasse ich ihn daher offen.


Das solltest du nicht.

Homebrew hält sich absichtlich /usr/local/bin nach /usr/bin im Weg für maximale Kompatibilität. Das Umkehren der Reihenfolge dieser Verzeichnisse PATHdurch Bearbeiten /etc/pathswürde bedeuten, dass alle Programme auf dem gesamten System, unabhängig davon, wie sie gestartet wurden, die Homebrew-Version eines Befehls erhalten. Einige können jedoch speziell die Apple-Version erwarten oder einfach keine neuere Version verwenden.

Wie kann man dieses Prinzip beibehalten und trotzdem die von Homebrew installierte Version von erhalten git? Wie das Sprichwort sagt, können alle Probleme mit einer Indirektionsebene gelöst werden (mit Ausnahme von zu vielen Indirektionsebenen). - Oder in diesem Fall, wie sich herausstellt, zwei Schichten.

Insbesondere gehörte es zu meinen Unix-Gewohnheiten, ein ~/binVerzeichnis zu haben, das ich am Anfang meines Verzeichnisses anbrachte PATH. Dies ist einer der ersten Punkte in meinem .bashrc:

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

Dies prüft, ob es PATHenthält ~/binund wenn nicht, stellt es es voran. Wenn diese Option aktiviert ist, hat es gitVorrang vor der Systemversion (anstelle aller von Homebrew verwalteten Binärdateien) und nur für Ihre Shell-Sitzungen (anstelle aller Programme, die von einem beliebigen Ort gestartet wurden, einschließlich GUI-Programmen) So einfach wie das Verknüpfen:

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

Sie könnten einen Symlink /usr/local/Cellar/git/1.8.2.1/bin/gitdirekt erstellen , müssen dann aber jedes Mal brew upgrade git(direkt oder indirekt) einen Symlink korrigieren . Wenn Sie einen Symlink zu Homebrews ortsfesten Symlink erstellen, müssen Sie sich darüber keine Gedanken machen.

Sie fügen also ein Verzeichnis zu Ihrem hinzu, $HOMEdamit Sie es hinzufügen und einen PATHSymlink zu einem Symlink erstellen können. Dies behebt Ihr Problem und zaubert Dr. Seuss ein Lächeln auf den Lippen. Yo dawg ich hüte dich wie symlinks, also setzen wir einen Pfad in deinen, PATHdamit du symlinken kannst, während du symlinkst.


1
Ausgezeichnet, das beantwortet genau das, was ich mich gefragt habe!
N_A

Dies scheint die richtige Antwort zu sein, aber ich kann die genauen auszuführenden Befehle nicht herausfinden. Ich erhalte beim Erstellen von Symlinks immer wieder die Meldung "Datei existiert".
Ryan

Nicht genug Details, um Ihnen zu helfen, sorry.
Aristoteles Pagaltzis

1
@ Ryan stellen Sie sicher, dass Sie die Reihenfolge der Argumente direkt im lnBefehl haben. Der erste Pfad ist das Ziel und der zweite der Symlink
Freedom_Ben

1
Es stimmt, dass ich auf el cap mit der veralteten Antwort gescheitert bin und es geschafft habe (ich benutze ZSH), die Reihenfolge des Pfades in .zshrcexport PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Urs am

17

Sie haben nichts falsch gemacht, aber es scheint ziemlich klar zu sein, dass dieses spezielle Problem verschwinden würde , wenn Sie sich /usr/local/binauf Ihrem Weg befinden /usr/binwürden. Die einfachste Lösung ist, genau das zu tun und so etwas zu formulieren

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

in deinem ~/.bash_profileso wird alles, was Homebrew installiert, zuerst gefunden. Auf diese Weise habe ich es auf meinem Mac eingerichtet, und es hat für mich so lange funktioniert, jedoch YMMV.

Es scheint , dass sie es mit funktionieren würde, glauben zu /usr/local/binsein , nachdem /usr/bin , also , während ich meine eigene up muckte haben könnte $PATH, kann ich sehen , wo ihre Dokumentation fehlt:

Beachten Sie, dass Sie /usr/local/binnachher setzen sollten, /usr/bin da einige Programme erwarten, dass sie die Systemversion von z. B. Ruby erhalten und brechen, wenn sie die neuere Homebrew-Version erhalten.

Aus der Diskrepanz zwischen wiki & brew doctor # 10738 . Beachten Sie, dass dieses Dokument weiter sagt : „Die FAQ (das obige Zitat) bezieht sich auf die PATH - Einstellung für GUI - Anwendungen, der Arzt (die Beratung setzt /usr/local/binvoraus /usr/bin . In PATH) bezieht sich auf den Pfad für CLI - Anwendungen einstellen“


1
Lässt das nicht zwei /usr/local/bins in meinem $PATH? Ich glaube schon Ich frage mich, ob wir stattdessen die Reihenfolge der Standardpfade in /etc/pathsoder den Inhalt von bearbeiten sollten /etc/paths.d. Aber das wird jeden Benutzer betreffen ... vielleicht keine schlechte Sache. Wie auch immer, ich wollte nur sehen, wie andere Leute das angegangen sind.
Meltemi

@Meltemi, der Geist dieser Antwort ist richtig: erneuern.das PATH(in der Art und Weise Ihrer Wahl) haben /usr/local/binprecede /usr/bin. Ich persönlich aktualisiere mein PATHin .bash_profilewie hier vorgeschlagen.

@ Nick- interessante Informationen ... und dienen nur dazu, die Sache zu verwirren (zumindest meine Sachen) ... Homebrew-Dokumente scheinen zu implizieren, dass Terminal-Befehle Apps aufnehmen sollten /usr/local/bin, obwohl sie /usr/binim Pfad verlaufen. Aber GUI-Apps brauchen spezielle Coddling? Es scheint, dass alle Apps, ob GUI oder nicht, die $ PATH-Variable anpassen müssen. Also, was vermisse ich (oder die Homebrew-Schöpfer)?
Meltemi

Ich denke, Homebrew geht davon aus, dass Sie die von Apple gelieferte ausführbare Datei zuerst verwenden möchten - git ist eine Änderung, da sie bis zu Lion nicht von Apple geliefert wurde, sodass Homebrew sie brauchte - jetzt können Sie die von Apple gelieferte Datei verwenden
user151019

Da stimme ich Mark zu. Bei MacPorts und Fink galt die Annahme, dass eine völlig unberührte, separate Umgebung bereitgestellt werden sollte, die von allem ab Werk von Apple bereitgestellt wird. Homebrew ging davon aus, dass Apples Zeug großartig ist und es nicht zu vermeiden, es zu verwenden (warum sollte man eine andere Version von gcc herunterladen, wenn Apples es wahrscheinlich tun wird?).
Nick Klauer

6

Ich bin mit der Antwort von Thomas nicht einverstanden. Durch Bearbeiten der Datei / etc / arrows werden die Ladepfade für alle Programme geändert. Dies kann gefährlich sein, wenn eine Systemanwendung erwartet, eine bestimmte Version einer Binärdatei zu finden, aber eine andere Version findet, weil Sie Ihre Pfaddatei bearbeitet haben. Ändern Sie stattdessen Ihre Pfadvariable in ~ / .bashrc (oder ~ / .bash_profile). Dann ändert sich Ihr Ladeweg nur innerhalb des Terminals:

# Hinzufügen einer Homebrew-App zu PATH
export PATH = / path / to / homebrew / app / bin: $ PATH

Laden Sie dann bash oder neu source ~/.bashrcund Sie können loslegen. Da der Homebrew-Pfad vor allem anderen steht, lädt bash die Version, die Sie mit Homebrew heruntergeladen haben.


In OS X wird das .bashrcstandardmäßig nicht geladen. Beschaffen Sie es manuell?
Slhck

Oh ja. Ich kam aus OS X von Ubuntu und war daran gewöhnt, eine zu haben, also .bashrcbeziehe ich sie von meiner .bash_profile. Wenn Sie die RC-Datei nicht erstellen möchten, können Sie den Befehl zu Ihrer hinzufügen .bash_profile.
Nathan

5

Soweit ich brewweiß /usr/local/bin, kollidiert (hat den gleichen Namen wie) nichts in einer von Apple verteilten ausführbaren Datei. Daher sollte das /usr/local/binim Weg haben /binund /usr/binkein Thema sein, da es keine Namenskollisionen geben sollte. * Beachten Sie jedoch die Probleme mit lsund tarund die Verwendung anderer Paketaggregatoren wie finkund port(MacPorts) weiter unten.

Brew Hat eines von zwei Dingen, die mir bekannt sind, dazu beigetragen, Namenskollisionen zu verwalten:

  1. BrewLässt nicht verbundene Fässer im Keller. Um etwas zu installieren, belässt brew die Werkzeuge an ihrem Platz und erstellt symbolische Verknüpfungen zu diesen Werkzeugen in /usr/local/bin. Für Tools, mit denen brewkeine Namenskollision auftreten soll, wird keine symbolische Verknüpfung erstellt.
  2. Für viele, wenn nicht alle Standardwerkzeuge, die sich auch in /binund befinden /usr/bin, wird brewder Link /usr/local/binmit einem "g" vorangestellt, um beispielsweise eine lsmit einem Sud durchzuführende Version zu verwenden gls. Einfach tun , um eine ls -lin /usr/local/binder verknüpften Dateien und finden - diejenigen , die sind brewdort setzen. Hinweis: Die brewinstallierten Tools, auf die mit ihren tatsächlichen Namen zugegriffen werden muss, befinden sich in /usr/local/Cellar/coreutils/8.21/libexec/gnubin.

Ich gehe /usr/local/binaus zwei Gründen keinen Weg - diese Gründe stehen am Ende meiner Antwort.

Um die Namenskollisionen in Ihrem System, die Verwendung zu bewerten brew doctorund zu diesem Abschnitt finden - Hier ist die brew doctor‚s Ausgabe von 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

Der Grund, warum ich die brewTools nicht an erster Stelle stelle , ist, dass die brewinstallierte lsund die tarBefehle die Dateisystem-ACL nicht richtig handhaben. überhaupt nicht gehandhabt . Dies ist ein GROSSES Problem, und um es zusammen mit dem damit verbundenen Problem der manSeitenkonfiguration, das mit dem Festlegen der $PATHrichtigen Tags einhergeht, zu vermeiden , stelle ich sicher, dass die OSXzugehörigen Tools, insbesondere die in /binund enthaltenen /usr/bin, an erster Stelle stehen.

Ein weiterer Grund, warum ich mich überhaupt nicht /usr/local/binin den Weg gestellt habe, ist, dass ich brewnicht gut mit anderen zusammen spiele finkund port(MacPorts) derzeit weitaus mehr unterstützte Pakete habe, die ich JETZT brauche . Zum Beispiel kann ich gnome-terminalmit fink, aber es wäre eine große Anstrengung sein mit einer Formel und das gleiche tun zu konstruieren brew. Also, ich halte /swund /optbei meiner Suche $PATH(für finkund port, respectively) und Referenz Dinge , die ich aus /usr/local/bin, einschließlich gnat, entweder buchstabierte, oder ich bash alias‚s, oder ich eine Quelle - setupDatei für eine ganz andere Umgebung , wenn ich schreibe AdaCode.

Die Sache ist, es hängt wirklich davon ab, was Sie zu der Zeit wollen und brauchen.

Hier ist ein Beispiel für das oben erwähnte ACL-Problem.

Mit den Standardwerkzeugen 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

und mit den brewinstallierten Tools:

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

und

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

Sie erhalten ähnliche Ergebnisse mit tarund ich kenne nicht viele andere brewTools, aber wer kann es sich leisten, dass 6 Monate später etwas kaputt geht, wegen eines ACLProblems!


Danke für die nützlichen Infos. In meinem System befinden sich derzeit jedoch ausführbare Dateien mit demselben Namen sowohl in / usr / bin als auch in / usr / local / bin (z. B. git, das, wie Sie bemerken, symbolisch verknüpft ist). Standardmäßig treten also Konflikte auf. Ich möchte auch die System-Tools für meine Shell-Arbeit überschreiben.
Stockholm

4

Hier gibt es eine ganze Reihe guter Antworten. Hier ist meins:

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

Sie müssen nicht für jedes Programm einen eigenen Alias ​​erstellen, und als Bonus bleiben die Standardinstallationen für den Fall, dass Sie sie benötigen, verfügbar.

Funktioniert genauso, wenn Sie ZSH verwenden. einfach ausschalten bashrcfür zshrc. Sie können myfür _oder sogar umschalten, @um beim Tippen zu sparen.


2

Anstatt überhaupt mit dem Pfad herumzuspielen (der in meiner Geschichte Monate später wieder auftaucht), habe ich einen Alias ​​für Git in mein benutzerdefiniertes Alias-Verzeichnis von zsh (~ / .zshrc / custom / git_alias.zsh) eingefügt.

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


0

Ich bevorzuge es, Änderungen auf Umgebungsvariablen zu beschränken, wie dies $PATHbei Benutzern der Fall ist, die die Änderung tatsächlich möchten. Daher füge ich einfach Folgendes hinzu ~/.bashrc:

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

0

Sie können den folgenden Befehl in einem Terminal ausführen, der das Ausgangsverzeichnis für das Brühen + das / bin im PATH der SHELL-Init-Datei "rc" (bash, zsh, csh) hinzufügt.

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

Genießen !

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.