¿Dónde colocar las aserciones de la variable $ PATH en zsh?

110

Me encanta zsh, pero no estoy seguro de dónde colocar mi $PATHy otras afirmaciones variables. Encuentro que están esparcidos entre los archivos .zshrc .zprofile .bashrc .bash_profiley, a veces, se duplican.

Soy consciente de que tener algo en el interior de los basharchivos no tiene mucho sentido ya que estoy usando zsh, pero dónde exactamente debería estar poniendo mi rvm, python, nodeadiciones, etc., para mi $PATH?

¿Hay un archivo específico que debería usar (es decir, .zshenvque no existe actualmente en mi instalación), uno de los que estoy usando actualmente, o incluso importa?

Stefmikhail
fuente

Respuestas:

148

tl; versión dr: use ~/.zshrc

Y lea la página del manual para comprender las diferencias entre:

~/.zshrc, ~/.zshenvY ~/.zprofile.


Respecto a mi comentario

En mi comentario adjunto a la respuesta que dio kev , dije:

Esto parece ser incorrecto: / etc / profile no aparece en ninguna documentación de zsh que pueda encontrar.

Esto resulta ser parcialmente incorrecto: /etc/profile puede ser obtenido por zsh. Sin embargo , esto solo ocurre si zshse "invoca como sho ksh"; en estos modos de compatibilidad:

Los scripts habituales de inicio / apagado de zsh no se ejecutan. Inicio de sesión shells source / etc / profile seguido de $ HOME / .profile. Si la variable de entorno ENV se establece en la invocación, $ ENV se obtiene después de los scripts de perfil. El valor de ENV está sujeto a expansión de parámetros, sustitución de comandos y expansión aritmética antes de ser interpretado como un nombre de ruta. [ man zshall, "Compatibilidad" ].

El enlace ArchWiki ZSH dice:

Al iniciar sesión, Zsh obtiene los siguientes archivos en este orden:
/ etc / profile
Este archivo proviene de todos los shells compatibles con Bourne al iniciar sesión

Este implys que /etc/profileestá siempre lea por zshal iniciar la sesión - No tengo ninguna experiencia con el proyecto Arch Linux; la wiki puede ser correcta para esa distribución, pero generalmente no es correcta. La información es incorrecta en comparación con las páginas del manual de zsh, y no parece aplicarse a zsh en OS X (las rutas $PATHestablecidas en /etc/profileno llegan a mis sesiones de zsh).



Para abordar la pregunta:

¿Dónde exactamente debería colocar mis adiciones de rvm, python, nodo, etc.a mi $ PATH?

En general, me gustaría exportar mi $PATHa partir ~/.zshrc, pero vale la pena tener una lectura de la zshall página del manual, en concreto la sección de "inicio / apagado ARCHIVOS" - ~/.zshrcse lee para interactivos conchas, que pueden o no pueden satisfacer sus necesidades - si desea que el $PATHde cada zshshell invocado por usted (ambos interactivey no, ambos loginy no, etc.), entonces ~/.zshenves una mejor opción.

¿Hay algún archivo específico que deba usar (es decir, .zshenv que no existe actualmente en mi instalación), uno de los que estoy usando actualmente, o incluso importa?

Hay un montón de archivos leídos al inicio (verifique las manpáginas vinculadas ), y hay una razón para eso: cada archivo tiene su lugar particular (configuraciones para cada usuario, configuraciones para usuarios específicos, configuraciones para shell de inicio de sesión, configuraciones para cada shell, etc).
No se preocupe por ~/.zshenvno existir: si lo necesita, hágalo y se leerá.

.bashrcy no.bash_profile son leídos por , a menos que los obtenga explícitamente de o similar; entre la sintaxis y es que no siempre son compatibles. Ambos y están diseñados para configuraciones, no configuraciones.zsh~/.zshrcbashzsh.bashrc.bash_profilebashzsh

Simont
fuente
3
Gracias por tu respuesta más que completa simont. Extraño que usted dice .bashrcy .bash_profileno son leídos por zshlo que actualmente tengo mi rvmademás de $PATHen .bashrc, y mi pythonadición en .bash_profile, y ambos se están agregando bien. En cualquier caso, voy a mover todas mis $PATHexportaciones a, ~/.zshrcya que todas las demás zshconfiguraciones están alojadas allí. Debo admitir que no estoy muy familiarizado con los diferentes tipos de conchas. Al leer los enlaces que publicaste, supongo que uso un shell interactivo, pero seguiré leyendo para estar seguro ... ¡Gracias de nuevo!
stefmikhail
30

Aquí están los documentos de las páginas de manual de zsh en la sección ARCHIVOS DE INICIO / APAGADO.

   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.

A partir de esto, podemos ver que el orden de lectura de los archivos es:

/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

Puede obtener más información aquí .

jor
fuente
18

Tuve un problema similar (en bash, el comando de terminal funcionaba correctamente, pero zsh mostró el error de comando no encontrado)

Solución:


simplemente pegue lo que estaba pegando anteriormente en ~ / .bashrc para:

~/.zshrc
abe312
fuente