Wo sollen $ PATH-Variablenzusicherungen in zsh platziert werden?


110

Ich liebe zsh, aber ich bin nicht sicher, wo ich meine $PATHund andere variable Behauptungen platzieren soll? Ich finde, dass sie zwischen den Dateien verstreut .zshrc .zprofile .bashrc .bash_profileund manchmal verdoppelt sind.

Ich stelle fest , dass innerhalb der etwas mit bashDateien nicht viel Sinn machen da ich verwende zsh, aber wo genau soll ich meine platzieren rvm, python, nodeetc Ergänzungen zu meinen $PATH?

Gibt es eine bestimmte Datei, die ich verwenden sollte (dh .zshenvdie derzeit in meiner Installation nicht vorhanden ist), eine der Dateien , die ich derzeit verwende, oder spielt es überhaupt eine Rolle?

Antworten:


148

tl; dr version: verwenden ~/.zshrc

Und die man - Seite lesen , die Unterschiede zu verstehen , zwischen:

~/.zshrc, ~/.zshenvUnd ~/.zprofile.


In Bezug auf meinen Kommentar

In meinem Kommentar zur Antwort von kev sagte ich:

Dies scheint falsch zu sein - / etc / profile ist in keiner zsh-Dokumentation aufgeführt, die ich finden kann.

Dies stellt sich als teilweise falsch heraus: /etc/profile kann von bezogen werden zsh. Dies tritt jedoch nur auf, wenn zsh"als shoder aufgerufen ksh" wird; in diesen Kompatibilitätsmodi:

Die üblichen zsh-Start / Shutdown-Skripte werden nicht ausgeführt. Login shells source / etc / profile gefolgt von $ HOME / .profile. Wenn die Umgebungsvariable ENV beim Aufruf festgelegt wird, wird $ ENV nach den Profilskripten bezogen. Der Wert von ENV wird einer Parametererweiterung, einer Befehlssubstitution und einer arithmetischen Erweiterung unterzogen, bevor er als Pfadname interpretiert wird. [ man zshall, "Kompatibilität" ].

Der ArchWiki ZSH-Link lautet:

Bei der Anmeldung bezieht Zsh die folgenden Dateien in dieser Reihenfolge:
/ etc / profile
Diese Datei wird bei der Anmeldung von allen Bourne-kompatiblen Shells bezogen

Diese bedeutet , das /etc/profilewird immer gelesen von zshbei der Anmeldung - ich hatte keine Erfahrung mit dem Arch Linux - Projekt; Das Wiki ist zwar für diese Distribution korrekt, aber im Allgemeinen nicht korrekt. Die Informationen sind im Vergleich zu den zsh-Handbuchseiten falsch und scheinen unter OS X nicht für zsh zu gelten (Pfade in $PATHset in /etc/profileschaffen es nicht zu meinen zsh-Sitzungen).



Um die Frage zu beantworten:

Wo genau soll ich meine rvm-, python-, node- usw. Ergänzungen zu meinem $ PATH platzieren?

Im Allgemeinen würde ich meine Export $PATHaus ~/.zshrc, aber es lohnt sich, einen Lesevorgang der mit zshall Manpage, insbesondere die „Start / Stop - Dateien“ - ~/.zshrcist für gelesen interaktive Schalen, die kann oder auch nicht Ihre Bedürfnisse anzupassen - wenn Sie möchten , $PATHfür Jede zshvon Ihnen aufgerufene Shell (beide interactiveund nicht, beide loginund nicht usw.) ist dann ~/.zshenveine bessere Option.

Gibt es eine bestimmte Datei, die ich verwenden sollte (dh .zshenv, die derzeit in meiner Installation nicht vorhanden ist), eine der Dateien, die ich derzeit verwende, oder spielt es überhaupt eine Rolle?

Beim Start werden eine Reihe von Dateien gelesen (überprüfen Sie die verlinkten manSeiten), und es gibt einen Grund dafür - jede Datei hat ihren bestimmten Speicherort (Einstellungen für jeden Benutzer, Einstellungen für benutzerspezifisch, Einstellungen für Login-Shells, Einstellungen für jede Shell, etc).
Mach dir keine Sorgen ~/.zshenv, dass es nicht existiert - wenn du es brauchst, mach es und es wird gelesen.

.bashrcund .bash_profilewerden nicht von gelesen zsh, es sei denn, Sie beziehen sie ausdrücklich von ~/.zshrcoder ähnlich; Die Syntax zwischen bashund zshist nicht immer kompatibel. Beide .bashrcund .bash_profilesind für bashEinstellungen ausgelegt, nicht für zshEinstellungen.


3
Vielen Dank für Ihre mehr als gründliche Antwort simont. Seltsam, dass Sie sagen .bashrcund .bash_profilenicht gelesen werden, zshda ich derzeit meine rvmHinzufügung zu $PATHin .bashrcund meine pythonHinzufügung in habe .bash_profileund beide gut hinzugefügt werden. In jedem Fall werde ich alle meine $PATHExporte verschieben, ~/.zshrcda alle meine anderen zshKonfigurationen dort untergebracht sind. Ich muss zugeben, ich bin mit den verschiedenen Arten von Muscheln nicht allzu vertraut. Nach dem Lesen der von Ihnen geposteten Links verwende ich vermutlich eine interaktive Shell, aber ich werde weiter lesen, um sicherzugehen ... Nochmals vielen Dank!
Stefmikhail

30

Hier sind die Dokumente aus den zsh-Manpages im Abschnitt STARTUP / SHUTDOWN FILES.

   Commands  are  first  read from /etc/zshenv this cannot be overridden.
   Subsequent behaviour is modified by the RCS and GLOBAL_RCS options; the
   former  affects all startup files, while the second only affects global
   startup files (those shown here with an path starting with  a  /).   If
   one  of  the  options  is  unset  at  any point, any subsequent startup
   file(s) of the corresponding type will not be read.  It is also  possi-
   ble  for  a  file  in  $ZDOTDIR  to  re-enable GLOBAL_RCS. Both RCS and
   GLOBAL_RCS are set by default.

   Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a  login
   shell,  commands  are  read from /etc/zprofile and then $ZDOTDIR/.zpro-
   file.  Then, if the  shell  is  interactive,  commands  are  read  from
   /etc/zshrc  and then $ZDOTDIR/.zshrc.  Finally, if the shell is a login
   shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

Daraus können wir ersehen, dass die Bestelldateien gelesen werden:

/etc/zshenv    # Read for every shell
~/.zshenv      # Read for every shell except ones started with -f
/etc/zprofile  # Global config for login shells, read before zshrc
~/.zprofile    # User config for login shells
/etc/zshrc     # Global config for interactive shells
~/.zshrc       # User config for interactive shells
/etc/zlogin    # Global config for login shells, read after zshrc
~/.zlogin      # User config for login shells
~/.zlogout     # User config for login shells, read upon logout
/etc/zlogout   # Global config for login shells, read after user logout file

Weitere Informationen erhalten Sie hier .


18

Ich hatte ein ähnliches Problem (in bash terminal funktionierte der Befehl korrekt, aber zsh zeigte den Befehl nicht gefunden Fehler)

Lösung:


Fügen Sie einfach alles ein, was Sie zuvor in ~ / .bashrc eingefügt haben, um:

~/.zshrc
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.