Zsh no presiona ~/.profile

Zsh no presiona ~/.profile

Acabo de instalar zsh en mi sistema Ubuntu. Parece que zsh no está ejecutando ~/.profile en el inicio. Según tengo entendido, este debería ser un comportamiento automático. ¿Qué me estoy perdiendo?

Respuesta1

.profilevs..zprofile

Zsh se ejecuta ~/.zprofile, no ~/.profile, cuando se invoca como shell de inicio de sesión. La razón es que zsh tiene suficientes incompatibilidades con shells estándar como para romper los scripts.

Zsh se ejecuta ~/.profilesi se llama como sho ksh. Pero si su objetivo es obtener un mensaje zsh cuando inicie sesión, eso no sirve de nada.

Puede crear /bin/shsu shell de inicio de sesión e incluirlo export SHELL=/bin/zshen su archivo ~/.profile. Luego, cuando abra una terminal, la terminal iniciará zsh (excepto algunos emuladores de terminal que no obedecen la $SHELLconfiguración). Pero aún lo tendrás shcuando inicies sesión a través de ssh. Esto se puede solucionar incluyéndolo exec zshal final de ~/.profile(esto reemplaza el shell en ejecución por zsh), pero debe tener cuidado de hacerlo solo para inicios de sesión interactivos y no cuando ~/.profilese incluye desde otros scripts como el inicio de sesión X (una buena opción). prueba es el nombre del proceso padre obtenido por ps -o comm= $PPID: si es sshdo su, entonces es seguro exec).

La solución más sencilla para trabajar con zsh y ejecutar ~/.profilees crear un ~/.zprofileque entre en modo de emulación sh mientras se ejecuta ~/.profile:

emulate sh
. ~/.profile
emulate zsh

Si tiene un zsh lo suficientemente reciente (en Ubuntu, eso significa que es lúcido, creo), puede simplificarlo a emulate sh -c '. ~/.profile'.

.zprofilevs..zshrc

El archivo ~/.profilees cargado poraccesoconchas. El shell de inicio de sesión es el primer proceso que se inicia cuando inicia sesión en modo texto, por ejemplo en una consola de texto o mediante ssh. De forma predeterminada, en la mayoría de las máquinas Linux, el shell de inicio de sesión es bash, pero puede cambiarlo con el chshcomando o mediante alguna otra herramienta como la "Configuración de usuario" en Ubuntu. Cuando se trata de un shell de inicio de sesión, bash lee ~/.bash_profilesi existe y ~/.profile, mientras que zsh solo lee ~/.zprofile(porque su sintaxis no es completamente compatible con un sh tradicional). En la mayoría de las configuraciones, ~/.profiletambién lo cargan los scripts de inicio de la sesión X cuando inicia sesión en un administrador de pantalla gráfica.

Cuando inicia un emulador de terminal y obtiene un indicador de shell, o cuando inicia un shell explícitamente, obtiene un shell que no es un shell de inicio de sesión. Dado que ~/.profile(o ~/.zprofile) es para comandos que desea ejecutar cuando inicia sesión, un shell sin inicio de sesión no lee este archivo. En cambio, cuando inicias un zsh interactivo, se lee ~/.zshrc. (Zsh lee ~/.zshrcen todos los shells interactivos, ya sean shells de inicio de sesión, no; bash, extrañamente, nunca lee ~/.bashrcen shells de inicio de sesión).

Normalmente, ~/.profilecontiene definiciones de variables de entorno y puede iniciar algunos programas que desee ejecutar una vez al iniciar sesión o durante toda la sesión; ~/.zshrccontiene cosas que se deben hacer para cada instancia de shell, como definiciones de alias y funciones, configuraciones de opciones de shell, configuraciones de finalización, configuraciones de mensajes, combinaciones de teclas, etc.

Respuesta2

Respuesta corta para gente impaciente:

  1. ~/.profileno se carga al zshiniciar sesión.
  2. zshse carga ~/.zprofileal iniciar sesión.
  3. zshse carga ~/.zshrcal iniciar una nueva sesión de terminal.

¿Necesitas más información? ¡Mira la magnífica respuesta de Gilles!

Respuesta3

Además de la respuesta de Gilles, con una versión razonablemente reciente de zsh puedes hacer esto:

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

... Lo que generará el archivo .profile con el modo sh de zsh vigente. Y solo está activo durante la fuente. Por lo tanto, no es necesario guardar el estado de la opción actual para poder reproducirla nuevamente después de obtenerla.

Respuesta4

Elzshdocumentación que tengo a mano solo menciona /etc/profiley ~/.profilepara shells de inicio de sesión ensh/kshmodo de compatibilidad.

% zsh --version
zsh 4.3.10 …
% cat ~/.profile
echo 'Running ~/.profile...'

El shell de inicio de sesión en modo nativo (argv[0] comienza con -) no usa ~/.profile(aunque sí lo usará ~/.zprofile):

% zsh -c 'exec -a -zsh zsh' </dev/null

(ninguna salida)

sh/kshLos shells de inicio de sesión en modo de compatibilidad utilizan .profile:

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...

información relacionada