Wie setze ich PATH in /etc/profile.d, wenn ich ZSH verwende?

22

Ich verwende zshals meine Shell und versuche, meine Umgebung zu konfigurieren.

Normalerweise definiere ich meine $JAVA_HOMEVariable durch Erstellen einer Datei:

/etc/profile.d/java.sh

mit folgendem Inhalt

export JAVA_HOME=/path/to/jdk
export PATH=$JAVA_HOME/bin:$PATH

dann logge ich mich aus und wieder ein und alles funktioniert, aber aus irgendeinem Grund ist die PATHVariable nicht gesetzt. Es erkennt JAVA_HOME, aber nicht das neue PATH, siehe dieses Terminal-Snippet:

~  echo $JAVA_HOME
/usr/lib/jvm/jdk1.8.0_05
~  echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

und ich bestätigte es, indem ich versuchte, einen Befehl aus dem JVM auszuführen

~  java -version
zsh: command not found: java

das PATHschließt nicht das mit ein, $JAVA_HOMEwie es sollte. Gibt es noch etwas, das ich überprüfen sollte?

Ich habe das überprüft, wenn ich laufe:

source /etc/profile.d/java.sh

es läuft alles korrekt und meine Variablen werden so gesetzt, wie sie sollten, aber sollten die Skripte /etc/profile.dnicht automatisch ausgeführt werden?

Rodrigo Sasaki
quelle
Haben Sie ~/.profilestattdessen versucht , die Variablen dort zu bearbeiten und zu platzieren? Möglicherweise PATHwird das an anderer Stelle in überschrieben /etc/profile.d/.
Saiarcot895

Antworten:

27

Aus meiner Sicht ist es am besten, die folgenden Zeilen in die ~/.zshrcDatei einzufügen (wenn Sie sie noch nicht haben, dann erstellen Sie sie):

if [ -d "/path/to/jdk" ] ; then
    export PATH="/path/to/jdk/bin:$PATH"
fi

Starten Sie dann Ihren Computer neu zshoder führen Sie ihn einfach aus, source ~/.zshrcund Ihr PFAD sollte genau so sein, wie Sie es wünschen.

Wenn Sie die Änderung systemweit vornehmen möchten, fügen Sie den vorherigen Code am Ende der /etc/zsh/zshenvDatei hinzu.

Aber auf keinen Fall /etc/profile.dzum automatischen Ausführen von Skripten verwenden zsh. Dieses Verzeichnis ist nur für die bashShell nützlich , nicht zshwie in Ihrem Fall. Um dies zu verstehen, öffnen Sie die /etc/profileDatei, die eine Bash- Initialisierungsdatei und in keinem Fall eine zsh- Initialisierungsdatei ist , und Sie sehen irgendwo am Ende der Datei:

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

Also, Ihre Skripte von /etc/profile.dVerzeichnis werden automatisch ausgeführt , zshnur wenn Sie den vorherigen Code in einer zsh Initialisierung Datei hinzufügen, wie /etc/zsh/zprofilezum Beispiel, oder Quelle /etc/profilein /etc/zsh/zprofileDatei.

Radu Rădeanu
quelle
4
Vielleicht ~/.zprofilekönnte besser sein als ~/.zshrc.
Muru
3

Ich finde, dass es .zshenvschwierig ist , alles in eine Datei zu packen. Ich empfehle, oh-my-sh zu installieren und dann verschiedene Anpassungen (env vars, functions) .oh-my-sh/custom/als separate .zshDateien in das Verzeichnis zu stellen .

Ich entdeckte auch, dass dieser Ansatz einwandfrei funktioniert, wenn Sie in die Maschine ssh'ing, wenn Sie Umgebungsvariablen wie ändern PATH. Es funktioniert auch sehr gut zusammen mit vcsh, um Anpassungen gesichert und synchron zu halten.

dvim
quelle
Wo würden Sie mit oh my zsh framework eine Variable mit einer IP-Adresse (Remote-Server) ablegen, die für den SSH-Zugriff verwendet werden soll? Ich brauche die IP für Git und ein Anmeldeskript für den Server.
Timo
1
Hm. Nicht ganz sicher, was du meinst. Ich würde die Config wie IP - Adressen setzen und Benutzernamen für ssh~/.ssh/config
dvim
Ich persönlich bevorzuge diesen Ansatz der akzeptierten Antwort, da mir der Vorteil der Verwendung von vcsh gefällt und der "benutzerdefinierte" Ordner für ZSH ein idealer Ort für solche Dinge ist.
Erick Brown
1

Seitdem JAVA_HOMEhaben Sie bestätigt, dass diese Skripte automatisch bezogen werden, nicht wahr?

Die einzige logische Erklärung ist, dass dies PATHspäter irgendwie festgelegt wird. Es sollte ursprünglich von PAM gesetzt werden, das liest /etc/environment, und soweit ich weiß, passiert das, bevor /etc/profile.d/*.shDateien bezogen werden. Möglicherweise funktioniert zsh in dieser Hinsicht anders als bash.

Gunnar Hjalmarsson
quelle
0

Nach dem Ausführen von Updates ist dieses Problem nur lokal aufgetreten. Es sieht so aus, als ob Drush nicht weiß, wo er eine legitime Kopie von PHP findet, die pdo enthält. Glücklicherweise unterstützt es das Verstauen dieses Pfades in einer Umgebungsvariablen, so dass ich dies auf der Kommandozeile tat:

export DRUSH_PHP="/Applications/MAMP/bin/php/php5.4.39/bin/php"

Das Problem wurde behoben, also habe ich .zshrc bearbeitet und der Datei hinzugefügt. Das Problem wurde behoben.

Allen Freeman
quelle
1
Sie schlagen also .zshrcvor, dass dies verwendet wird, genau wie die Top-Antwort ?
muru