Gibt es ein Problem damit, dass / usr / local / bin vor / usr / bin in OS X auf dem Pfad steht?

70

Standardmäßig /usr/libexec/path_helperfügt OS X 10.6 die folgenden in der Datei aufgeführten Pfade hinzu /etc/paths:

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

Das heißt, das /usr/binkommt vorher /usr/local/binauf den Weg. Dies führt in der Version von git von Xcode 4 installierte in /usr/bindem statt der von Homebrew in installierte Version aufgerufen werden /usr/local/bin.

Was mich zu meiner Frage führt, gibt es ein Problem damit, /usr/local/binvorher /usr/binauf dem Weg gekommen zu sein? Gibt es einen bestimmten Grund, warum Apple standardmäßig vorher /usr/bingekommen ist /usr/local/bin?

So ändern Sie die Reihenfolge von /usr/binund/usr/local/bin

Ist es ein Problem, /usr/local/binvom unteren Rand der Datei /etc/pathsnach oben zu wechseln ? Dies würde sich nicht nur auf den Pfad auswirken, wenn ich Terminal starte, da /usr/libexec/path_helperdies von anderen Ressourcen verwendet werden könnte (da bin ich mir nicht sicher).

Obwohl redundant, erscheint es mir sicherer /usr/local/bin, den Pfad in hinzuzufügen ~/.bash_profile, was bedeuten würde, dass er /usr/local/binzweimal auf dem Pfad ist.

Matthew Rankin
quelle

Antworten:

27

Nein und nein. Sie sind einfach komisch ... lokal sollte per Definition überschrieben werden.

Forrest Voight
quelle
Irgendeine Idee, wenn es ein Problem beim Ändern der /etc/pathsDatei gibt oder ich sie einfach /usr/local/binzu meiner hinzufügen sollte ~/.bash_profile?
Matthew Rankin
4
Beides sollte gut funktionieren, aber ich würde versuchen, nur die Änderungen pro Benutzer vorzunehmen, damit das System nicht versehentlich zerstört wird, wenn eine inkompatible lokale Version installiert wird.
Forrest Voight
@MatthewRankin Bearbeiten Sie die / etc / Pfade wird kein Problem sein !!! Ich bin auch früher auf dieses Problem gestoßen. Vielen Dank für diese Frage. :)
Juanito Fatas
2

Ich fand all das nützlich, besonders die Warnung von @Ohgyun Ahn . Also schlage ich einen Kompromiss vor, den ich gerade umgesetzt habe:

Bearbeiten Sie /etc/pathsoder /private/etc/paths(wie in OS X 10.8) und überschreiben Sie git alleine . Dies entgeht jeglichen Sicherheitsauswirkungen (jedenfalls ohne Bezug zu Git), während das aktuelle Git für alle Programme implementiert wird, die den systemweiten Pfad tatsächlich überprüfen.

  1. Erstellen Sie ein neues Verzeichnis, das beispielsweise für die Überschreibung verwendet werden soll /usr/local/git-override/
  2. Erstellen Sie neue Symlinks von Git-Override zu den Git-Programmen von Homebrew. Erstelle einfach die Git-Symlinks von neu /usr/local/bin.
  3. hinzufügen /usr/local/git-overrideZum Seitenanfang (/private)/etc/paths.

Hoffe, das ist hilfreich für jemand anderen.

Komplex
quelle
2

Ich möchte nur hinzufügen, dass Sie, wenn Sie Ihren PATH sauber halten möchten (keine doppelten Einträge), Ihrem .bash_profile Folgendes hinzufügen können, um den gewünschten Effekt zu erzielen:

# remove /usr/local/bin and /usr/bin
export PATH=`echo ":$PATH:" | sed -e "s#:/usr/local/bin:#:#g" -e "s/^://" -e "s/:$//"`
export PATH=`echo ":$PATH:" | sed -e "s#:/usr/bin:#:#g" -e "s/^://" -e "s/:$//"`
# add /usr/local/bin and /usr/bin in that order
export PATH="/usr/local/bin:/usr/bin:$PATH"

Ich habe diesen kleinen Trick von http://ntk.me/2013/05/04/path-environment-variable/ gelernt.

Edit: Sehr wichtig! Erhalten Sie nicht die Reihenfolge, dass diese falsch entfernt werden! Wenn Sie dies tun, sedwird es nicht funktionieren und Sie werden /usr/local/bin:/usr/bin:als PFAD zurückbleiben!

Es ist auch erwähnenswert, dass die anderen, die darauf hinweisen, dass dies einige Sicherheitsprobleme verursachen könnte, korrekt sind. Bitte verstehen Sie die damit verbundenen Risiken!

vmrob
quelle
1

Da die Reihenfolge der /etc/pathsNähte geändert wurde , um die Systemstabilität und -sicherheit zu gewährleisten, ist hier meine Lösung, die auf der Antwort von @vmrob basiert

read PATH < <(echo "$PATH" | sed  \
    -e 's/^/:/' -e 's/$/:/'       \
    -e 's_:/usr/local/bin:_:_g'   \
    -e 's_:/usr/local/sbin:_:_g'  \
    -e "s_:/usr/bin:/bin:_:$HOME/bin:/usr/local/bin:/usr/bin:/bin:_"        \
    -e "s_:/usr/sbin:/sbin:_:$HOME/sbin:/usr/local/sbin:/usr/sbin:/sbin:_"  \
    -e 's/^://' -e 's/:$//')
export PATH
166_MMX
quelle