Où placer les assertions de variable $ PATH dans zsh?

111

J'adore zsh, mais je ne sais pas où placer mes $PATHaffirmations variables et d'autres? Je trouve qu'ils sont dispersés entre les fichiers .zshrc .zprofile .bashrc .bash_profile, et parfois doublés.

Je me rends compte que d' avoir quoi que ce soit à l' intérieur des bashfichiers ne fait pas beaucoup de sens car j'utilise zsh, mais où exactement dois - je passer ma rvm, python, nodeadditions etc à mon $PATH?

Y a-t-il un fichier spécifique que je devrais utiliser (c'est-à-dire .zshenvqui n'existe pas actuellement dans mon installation), l'un de ceux que j'utilise actuellement, ou est-ce même important?

stefmikhail
la source

Réponses:

148

tl; version dr: utiliser ~/.zshrc

Et lisez la page de manuel pour comprendre les différences entre:

~/.zshrc, ~/.zshenvEt ~/.zprofile.


Concernant mon commentaire

Dans mon commentaire joint à la réponse de kev , j'ai dit:

Cela semble incorrect - / etc / profile n'est répertorié dans aucune documentation zsh que je puisse trouver.

Cela s'avère partiellement incorrect: /etc/profile peut provenir de zsh. Cependant , cela ne se produit que si zshest "invoqué en tant que shou ksh"; dans ces modes de compatibilité:

Les scripts habituels de démarrage / arrêt de zsh ne sont pas exécutés. Le login shells source / etc / profile suivi de $ HOME / .profile. Si la variable d'environnement ENV est définie lors de l'appel, $ ENV provient des scripts de profil. La valeur d'ENV est soumise à l'expansion des paramètres, à la substitution de commandes et à l'expansion arithmétique avant d'être interprétée comme un chemin. [ man zshall, "Compatibilité" ].

Le lien ArchWiki ZSH dit:

Lors de la connexion, Zsh recherche les fichiers suivants dans cet ordre:
/ etc / profile
Ce fichier provient de tous les shells compatibles Bourne lors de la connexion

Ce implys qui /etc/profileest toujours lu par zshà la connexion - Je n'ai aucune expérience avec le projet Arch Linux; le wiki peut être correct pour cette distribution, mais il n'est généralement pas correct. Les informations sont incorrectes par rapport aux pages de manuel zsh et ne semblent pas s'appliquer à zsh sous OS X (les chemins $PATHdéfinis dans /etc/profilene parviennent pas à mes sessions zsh).



Pour répondre à la question:

où dois-je placer exactement mes ajouts rvm, python, node, etc. à mon $ PATH?

En général, j'exporterais mon $PATHdepuis ~/.zshrc, mais cela vaut la peine d'avoir une lecture de la page de manuel zshall , en particulier la section "FICHIERS DE DÉMARRAGE / ARRÊT" - ~/.zshrcest lue pour les shells interactifs , qui peuvent ou non répondre à vos besoins - si vous voulez le $PATHpour chaque zshshell invoqué par vous (les deux interactiveet non, les deux loginet non, etc.), ~/.zshenvest alors une meilleure option.

Y a-t-il un fichier spécifique que je devrais utiliser (c'est-à-dire .zshenv qui n'existe pas actuellement dans mon installation), l'un de ceux que j'utilise actuellement, ou est-ce même important?

Il y a un tas de fichiers lus au démarrage (vérifiez les manpages liées ), et il y a une raison à cela - chaque fichier a sa place particulière (paramètres pour chaque utilisateur, paramètres spécifiques à l'utilisateur, paramètres pour les shells de connexion, paramètres pour chaque shell, etc).
Ne vous inquiétez pas de ~/.zshenvne pas exister - si vous en avez besoin, faites-le et il sera lu.

.bashrcet ne.bash_profile sont pas lus par zsh, sauf si vous les fournissez explicitement ~/.zshrcou similaires; la syntaxe entre bashet zshn'est pas toujours compatible. Les deux .bashrcet .bash_profilesont conçus pour les bashparamètres, pas les zshparamètres.

Simont
la source
3
Merci pour votre réponse plus que approfondie simont. Étrange que vous disiez .bashrcet que vous ne .bash_profilesoyez pas lu zshcomme j'ai actuellement mon rvmajout $PATHdans .bashrc, et mon pythonajout dans .bash_profile, et les deux sont ajoutés très bien. Dans tous les cas, je vais déplacer toutes mes $PATHexportations vers ~/.zshrccar toutes mes autres zshconfigurations y sont hébergées. Je dois admettre que je ne connais pas très bien les différents types de coquilles. En lisant les liens que vous avez postés, je suppose que j'utilise un shell interactif, mais je vais lire plus loin pour être sûr ... Merci encore!
stefmikhail
30

Voici la documentation des pages de manuel zsh dans la section 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.

À partir de là, nous pouvons voir que les fichiers de commande sont lus:

/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

Vous pouvez obtenir plus d'informations ici .

jor
la source
18

J'ai eu un problème similaire (dans le terminal bash, la commande fonctionnait correctement mais zsh a montré une erreur de commande introuvable)

Solution:


collez simplement ce que vous étiez précédemment collé dans ~ / .bashrc dans:

~/.zshrc
abe312
la source