11 votos

¿Cuál es el archivo correcto para almacenar variables de entorno para zsh?

Estoy un poco confundido sobre cómo funciona todo esto. Aparentemente, cada tutorial me dice algo diferente. Hasta ahora hay unos 4 archivos diferentes a los que puedo añadir variables de entorno:

.zshrc

.profile

.zprofile

.zshenv

¿A qué archivo debería añadir variables de entorno? Hasta ahora tengo variables en todos ellos, junto con otras cosas como alias.

¿Realmente importa, o hay un estándar adecuado a seguir?

Editar: Pregunta cerrada debido a que es 'basada en opiniones'. Para aclarar, por favor proporciona solo respuestas factuales y no opiniones.

0 votos

La versión inicial de la respuesta que recibiste en realidad solo estaba expresando una opinión :-)

0 votos

No es necesario profundizar en tutoriales para esto: simplemente haz un man zshall y busca la sección etiquetada como ARCHIVOS DE INICIO/CIERRE. A partir de esto aprenderás qué archivos son procesados bajo qué circunstancias por zsh (ayuda hacer un diagrama de los diferentes casos en una hoja de papel), y luego verás dónde quieres colocar qué definiciones, para que se ajusten mejor. Mayormente, distinguirás 4 casos: shell de inicio no interactivo, shell no interactivo no de inicio, shell interactivo de inicio, shell interactivo no de inicio.

9voto

yoliho Puntos 340

Hay un estándar definido en el manual de zsh https://zsh.sourceforge.io/Doc/Release/Files.html#Startup_002fShutdown-Files

Desafortunadamente Apple no los leyó completamente y por eso para macOS hay una ligera diferencia. O intentaron proporcionar la adición al path solo para sesiones de inicio de sesión pero su solución path_helper desordena lo que el usuario establece en .zshenv.

El archivo en el que están las variables difiere ya que los archivos se leen de manera diferente dependiendo de cómo se inicia el shell.

Entonces, dados los archivos que mencionas

.profile

Nada que ver con zsh - es el archivo que lee sh. (bash lo leerá como un shell de inicio de sesión si no hay .bash_profile

.zshenv

Este archivo es leído por todos los shells zsh cuando se inician. Así que cualquier variable de entorno común debería estar aquí. Esto incluye $PATH si sigues el manual de zsh; sin embargo, Apple no leyó eso y en /etc/zshrc que se lee después de eso añaden y reordenan el $PATH

Este archivo es leído por scripts.

.zshenv se origina en todas las invocaciones del shell, a menos que se establezca la opción -f. Debería contener comandos para establecer la ruta de búsqueda de comandos, además de otras variables de entorno importantes. .zshenv no debería contener comandos que produzcan salida o asuman que el shell está conectado a una tty.

.zprofile y .zlogin

Llamado al iniciar sesión - esto es en cada Terminal en macOS pero solo una vez en otros Unixes

.zlogin se origina en shells de inicio de sesión. Debería contener comandos que deberían ejecutarse solo en shells de inicio de sesión. .zlogout se origina cuando los shells de inicio de sesión se cierran. .zprofile es similar a .zlogin, excepto que se origina antes de .zshrc. .zprofile está pensado como una alternativa a .zlogin para los aficionados a ksh; no se pretende que ambos se usen juntos, aunque ciertamente esto podría hacerse si se desea.

.zlogin no es el lugar para definiciones de alias, opciones, configuraciones de variables de entorno, etc.; como regla general, no debería cambiar el entorno del shell en absoluto. Más bien, debería utilizarse para establecer el tipo de terminal y ejecutar una serie de comandos externos (fortune, msgs, etc).

.zshrc

Esto se lee en un shell interactivo es decir cuando ejecutas el shell para escribir cosas.

.zshrc se origina en shells interactivos. Debería contener comandos para configurar alias, funciones, opciones, combinaciones de teclas, etc.

También en macOS este es el lugar más sencillo para alterar el $PATH para corregir el orden que Apple cambia con /usr/libexec/path_helper ya que tu cambio está en un solo lugar - sin embargo, si deseas ser completo puedes arreglar los cambios de path_helper en ~/.zlogin pero también entonces necesitarías añadir tus cambios en $PATH en otro archivo para ejecuciones no interactivas también).

0 votos

Ciertamente arroja algo de luz sobre un área muy confusa para mí. Solo tengo .zshrc, ninguno de los otros. ¿Eso es malo? Además, no tengo /etc/path_helper (macOS 12.2).

0 votos

Lo siento, hice eso de memoria y me equivoqué. He editado la ruta correcta /usr/libexec/path_helper

0 votos

Gracias por esto. Esto aclara algunas cosas para mí. Siento que necesito hacer un curso sobre todo este tipo de cosas, ya que claramente me falta conocimiento cuando se trata de shells, etc.

-1voto

Tyler Durden Puntos 109

En línea con los estándares en Bash y .bashrc, puedes sentirte seguro almacenando variables de entorno para zsh en .zshrc.

La explicación oficial del orden de carga y el propósito de los archivos de puntos están en el manual de zsh:

ARCHIVOS DE INICIO/APAGADO

       Los comandos se leen primero desde /etc/zshenv; esto no puede ser anulado.
       El comportamiento posterior es modificado por las opciones RCS y GLOBAL_RCS; la primera afecta a todos los archivos de inicio, mientras que la segunda solo afecta a los archivos de inicio globales (los que se muestran aquí con una ruta que comienza con /). Si alguna de las opciones se desactiva en algún momento, no se leerán los archivos de inicio(s) posteriores del tipo correspondiente. También es posible para un archivo en $ZDOTDIR reactivar GLOBAL_RCS. Ambos RCS y GLOBAL_RCS están activadas por defecto.

       Luego se leen los comandos de $ZDOTDIR/.zshenv. Si el shell es un shell de inicio de sesión, se leen comandos desde /etc/zprofile y luego $ZDOTDIR/.zprofile. Luego, si el shell es interactivo, se leen comandos desde /etc/zshrc y luego $ZDOTDIR/.zshrc. Finalmente, si el shell es un shell de inicio de sesión, se leen /etc/zlogin y $ZDOTDIR/.zlogin.

       Cuando un shell de inicio de sesión se cierra, se leen los archivos $ZDOTDIR/.zlogout y luego /etc/zlogout. Esto ocurre ya sea con una salida explícita mediante los comandos exit o logout, o una salida implícita al leer el final del archivo desde el terminal. Sin embargo, si el shell termina debido a la ejecución de otro proceso, los archivos de cierre no se leen. Estos también son afectados por las opciones RCS y GLOBAL_RCS. También hay que tener en cuenta que la opción RCS afecta al guardado de archivos de historial, es decir, si RCS no está activada cuando el shell se cierra, no se guardará ningún archivo de historial.

       Si ZDOTDIR no está definida, se usará HOME en su lugar. Los archivos mencionados anteriormente como estando en /etc pueden estar en otro directorio, dependiendo de la instalación.

       Como /etc/zshenv se ejecuta para todas las instancias de zsh, es importante mantenerlo lo más pequeño posible. En particular, es una buena idea poner el código que no necesita ejecutarse para cada shell detrás de una prueba del tipo `if [[ -o rcs ]]; then ...' para que no se ejecute cuando zsh se invoque con la opción `-f'.

       Cualquiera de estos archivos puede ser pre-compilado con el comando incorporado zcompile (consulte zshbuiltins(1)). Si existe un archivo compilado (llamado como el archivo original más la extensión .zwc) y es más reciente que el archivo original, se utilizará el archivo compilado en su lugar.

ARCHIVOS

  • $ZDOTDIR/.zshenv
  • $ZDOTDIR/.zprofile
  • $ZDOTDIR/.zshrc
  • $ZDOTDIR/.zlogin
  • $ZDOTDIR/.zlogout
  • ${TMPPREFIX}* (por defecto es /tmp/zsh*)
  • /etc/zshenv
  • /etc/zprofile
  • /etc/zshrc
  • /etc/zlogin
  • /etc/zlogout (específico de la instalación - /etc es el predeterminado)

0 votos

Perfecto, gracias. Mi pregunta fue cerrada porque era basada en opiniones (lo cual es incorrecto). Afortunadamente la respondiste a tiempo :) Busqué en el manual pero no pude encontrar nada al respecto. Buscando nuevamente, lo encontré.

1 votos

-1 como zsh no es bash, tiene un orden mejorado de archivos de inicio. El lugar correcto para muchas variables de entorno es ~/.,zshenv, zsh es más claro para qué son los archivos. También ~/.zshrc no se llama en todos los casos

1 votos

zsh ¿tiene un mejor orden? Dificilmente. zsh toma lo que hace bash y lo empeora. Mucho peor.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X