
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
.profile
vs..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 ~/.profile
si se llama como sh
o ksh
. Pero si su objetivo es obtener un mensaje zsh cuando inicie sesión, eso no sirve de nada.
Puede crear /bin/sh
su shell de inicio de sesión e incluirlo export SHELL=/bin/zsh
en su archivo ~/.profile
. Luego, cuando abra una terminal, la terminal iniciará zsh (excepto algunos emuladores de terminal que no obedecen la $SHELL
configuración). Pero aún lo tendrás sh
cuando inicies sesión a través de ssh. Esto se puede solucionar incluyéndolo exec zsh
al 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 ~/.profile
se 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 sshd
o su
, entonces es seguro exec
).
La solución más sencilla para trabajar con zsh y ejecutar ~/.profile
es crear un ~/.zprofile
que 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'
.
.zprofile
vs..zshrc
El archivo ~/.profile
es 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 chsh
comando 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_profile
si 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, ~/.profile
tambié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 ~/.zshrc
en todos los shells interactivos, ya sean shells de inicio de sesión, no; bash, extrañamente, nunca lee ~/.bashrc
en shells de inicio de sesión).
Normalmente, ~/.profile
contiene 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; ~/.zshrc
contiene 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:
~/.profile
no se carga alzsh
iniciar sesión.zsh
se carga~/.zprofile
al iniciar sesión.zsh
se carga~/.zshrc
al 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/profile
y ~/.profile
para 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...