$ PATH macht mich verrückt

10

OK, entschuldige, wenn das etwas Dummes ist, aber mir gehen die Ideen aus.

Ziel: prepend /usr/local/binzu$PATH

Problem: $PATH Ich werde nicht tun, was ich will oder erwarte

Wie ich hierher gekommen bin : Ich möchte anfangen, Programmieren zu lernen, damit ich mich unter der Haube wohlfühlen kann, aber nicht viel Erfahrung habe. Ich habe die fishShell installiert (weil sie freundlich ist!) homebrewUnd sie als meine Standard-Shell (unter system prefs>users & groups>advanced) festgelegt. Irgendwann lief ich, um brew doctorzu sehen, ob meine Installationen alle koscher waren, und es schlug /usr/local/binvor $PATH, dass ich nach vorne gehen sollte, damit ich meine Installation gitanstelle der Systemkopie verwenden konnte. Gut - aber zwischen path_helperund fishpassierte etwas, $PATHdas außerhalb meiner Kontrolle lag, und ich konnte die Wege nie richtig anordnen.

Umwelt: OSX 10.8.2, von 10.7ish aufgerüstet, mit xcodeund devtools installiert, und x11, homebrewundfish

Mehr Info: Ich habe meine Benutzer-Standard - Shell wieder auf bashund versuchte , eine Vielzahl von Schalen durch terminal.app- bash, fish, sh. Ich bin nach /usr/local/binoben gegangen, /etc/pathsaber es hat nichts geändert. Ich habe die verschiedenen config.fishDateien durchgesehen und Dinge auskommentiert, die mit $ PATH zu tun haben könnten, hat nicht geholfen. Ich habe die folgenden Dateien in /etc/paths.d/:

./10-homebrew enthält /usr/local/bin

./20-fish enthält /usr/local/Cellar/fish/1.23.1/bin

./40-XQuartz enthält /opt/X11/bin

Ich habe set +xzu meinen profileund wenn ich beginne terminal.appich:

Last login: Mon Oct  1 13:31:06 on ttys000
+ '[' -x /usr/libexec/path_helper ']'
+ eval '/usr/libexec/path_helper -s'
++ /usr/libexec/path_helper -s PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/fish/1.23.1/bin:/opt/X11/bin";
export PATH;
+ '[' /bin/bash '!=' no ']'
+ '[' -r /etc/bashrc ']'
+ . /etc/bashrc
++ '[' -z '\s-\v\$ ' ']'
++ PS1='\h:\W \u\$ '
++ shopt -s checkwinsize
++ '[' Apple_Terminal == Apple_Terminal ']'
++ '[' -z '' ']'
++ PROMPT_COMMAND='update_terminal_cwd; '
++ update_terminal_cwd
++ local 'SEARCH= '
++ local REPLACE=%20
++ local PWD_URL=file://Chriss-iMac.local/Users/c4
++ printf '\e]7;%s\a' file://Chriss-iMac.local/Users/c4 
Chriss-iMac:~ c4$

Es sieht also so aus, als würde path_helper ausgeführt, aber dann werden echo $PATHmir Netze hinzugefügt /usr/bin:/bin:/usr/sbin:/sbin. Es sieht also so aus, als würde es path_helpernicht mehr das tun, was es soll?

Ich bin mir sicher, dass es hier ein genau definiertes Verhalten gibt, das ich nicht verstehe, oder ich habe etwas verpfuscht, während ich versucht habe, es zu beheben. Bitte helfen Sie!

Chris4d
quelle
Beachten Sie, dass ich es fishdurch Erstellen ~/.config/fish/config.fishmit zum Laufen bringen kann, set PATH /usr/local/bin $PATHaber ich habe immer noch das Problem, dass es path_helperanscheinend nicht so funktioniert, wie es sollte, und $PATHdaher unvollständig ist. $PATH
Habe

Antworten:

5

Lösung:

Wählen Sie, ob Sie eine systemweite Einstellung oder eine Benutzerkonfiguration wünschen, und bearbeiten Sie die entsprechende Konfigurationsdatei. Verwenden Sie path_helper nicht mit fish.

Mehr

fish gibt / etc / profile nicht an, für die systemweite Konfiguration und die Benutzerkonfiguration wird /etc/fish/config.fish bzw. ~ / .config / fish / config.fish [1] gelesen.

path_helper ist für Shells gedacht, die eine systemweite Profildatei (sh, csh und ihre Derivate) als Quelle verwenden. Da 10.7 path_helper die Reihenfolge in / etc / path zu beachten scheint, hat AFAIR dies in 10.6 nicht getan, und das war schwieriger zu bewältigen.

Wenn Sie path_helper wirklich mit fish verwenden möchten, müssen Sie die Ausgabe analysieren, da nur die Syntax sh und csh mit den Optionen -s und -c bereitgestellt wird.

Etwas wie

/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g'

sollte den Job machen:

[1] http://ridiculousfish.com/shell/user_doc/html/index.html#initialization

anddam
quelle
Groß! Dies ist, was ich jetzt habe: if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end- funktioniert hier gut mit Fisch 2 und Mac OS 10.8.3
Topskip
3

Ich habe absolut keine Ahnung von /etc/paths.d, path_helper usw., die mir alle als übermäßige Komplikationen erscheinen, aber das Folgende am Ende Ihres ~ / .bashrc sollte Sie korrigieren:

 PATH=/usr/local/bin:$PATH

Hoffe das hilft!

Aaron Miller
quelle
Danke Aaron - path_helperist ein OSX-spezifisches Dienstprogramm, das angeblich $PATHbeim Anmelden durch Lesen von /etc/pathsund dann festgelegt wird /etc/paths.d/*. Wie auch immer, ich verstehe, dass Ihr Vorschlag mich reparieren sollte bash, aber ich möchte, dass er funktioniert fish(und konsistent im gesamten System, wenn das nicht zu viel zu erwarten ist).
Chris4d
Ah - tut mir leid. Ich bin selbst kein OS X-Benutzer, mehr schade, aber nach ein bisschen Google-Bashing sieht es so aus, als ob diese Frage zum Stapelüberlauf eher dem entspricht, wonach Sie suchen - das heißt, ich bin auch kein OS X-Benutzer selbst und antwortete nur, weil ein kurzer (sprich: nachlässiger) Blick auf Ihre Frage mich glauben ließ, dass Sie nur an Bash interessiert waren. Nehmen Sie meinen Rat hier mit mehreren Körnern Salz an. Hoffe es hilft
Aaron Miller
3

Vielen Dank an Aaron für die Antwort und an alle, die andere ähnliche Fragen auf den Stackexchange-Sites beantwortet haben. Um der Nachwelt willen habe ich Folgendes herausgefunden:

  1. path_helperwird von /etc/profiledurch die Syntax aufgerufen eval '/usr/libexec/path_helper -s'(wobei die Apostrophe tatsächlich Backticks sind). Wie ein Dummy wusste ich nicht, wie Backticks funktionieren, und hatte sie aus irgendeinem Grund in Anführungszeichen geändert. Dies hat mich profilevom Laden abgehalten path_helper. Ersetzte die Back-Ticks und jetzt funktioniert es wie es sollte (natürlich).
  2. Durch die Verwendung set PATH /usr/local/bin $PATHin my wird ~/.config/fish/profile.fishsichergestellt, dass ich in meiner bevorzugten Shell die richtige Reihenfolge erhalte. Solange dies path_helperfunktioniert, ist es möglicherweise redundant.
  3. Um sicherzustellen, dass das $PATHGanze für Skripte, GUI-Apps usw. verfügbar ist, scheint es ein Fehler zwischen launchd.confund environment.plist... zu sein, der dieses noch untersucht.
Chris4d
quelle
1
Ich habe neulich gelesen (aber ich erinnere mich nicht an die Quelle), dass 10.8 keine todsichere Möglichkeit mehr bietet, einen Pfad für alle Apps sichtbar zu machen. Ich erinnere mich insbesondere daran, dass environment.plist nicht mehr gelesen wird; Ich bin mir vage der launchd.conf bewusst, so dass das funktionieren könnte, aber ich denke, der Artikel schlug vor, dass dies nicht der Fall sein würde.
Echristopherson
1
Weitere Folgemaßnahmen: Es sieht nicht so aus, als ob path_helper bei Fischen überhaupt funktioniert. Es gibt entweder csh- oder bash-Syntax aus, die beide nicht kompatibel sind. Stattdessen können Sie ~ / .config / fish / config.fish (das Startskript für Fische) verwenden, um /etc/paths.d/* zu katzen und an $ PATH anzuhängen. Hoffe das hilft jemandem!
Chris4d
Hast du meine Antwort überhaupt gelesen? Es ist seit vier Monaten vor Ihrem Follow-up da
und