Zsh no golpea ~ / .profile

145

Acabo de instalar zsh en mi sistema Ubuntu. Parece que zsh no está ejecutando ~ / .profile en init. A mi entender, este debería ser un comportamiento automático. ¿Qué me estoy perdiendo?

shmichael
fuente

Respuestas:

204

.profile vs. .zprofile

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

Zsh se ejecuta ~/.profilesi se llama como sho ksh. Pero si su objetivo es obtener un indicador de zsh cuando inicie sesión, no será de ayuda.

Puede hacer /bin/shsu shell de inicio de sesión e incluirlo export SHELL=/bin/zshen su ~/.profile. A continuación, cuando se abre un terminal, el terminal se lanzará zsh (a excepción de algunos emuladores de terminal no obedecen a la $SHELLconfiguración). Pero aún tendrá shcuando inicie sesión a través de ssh. Esto se puede solucionar mediante la inclusión exec zshal final de ~/.profile(esto reemplaza el shell en ejecución por zsh), pero debe tener cuidado solo para hacerlo para inicios de sesión interactivos y no cuando ~/.profilese incluye desde otros scripts como el inicio de la sesión X (un buen test es el nombre del proceso padre obtenido por ps -o comm= $PPID: si es sshdo su, entonces es seguro hacerlo exec).

La solución más fácil para trabajar con zsh y ejecutar ~/.profilees crear un ~/.zprofilemodo 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 simplificar esto emulate sh -c '. ~/.profile'.

.zprofile vs. .zshrc

El archivo ~/.profilese carga mediante shells de inicio de sesión . 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 manera 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 se carga con los scripts de inicio de 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. Como ~/.profile(o ~/.zprofile) es para comandos que desea ejecutar cuando inicia sesión, un shell que no inicia sesión no lee este archivo. En cambio, cuando inicia un zsh interactivo, se lee ~/.zshrc. (Zsh lee ~/.zshrcen todos los shells interactivos, si son shells de inicio de sesión no lo son; bash, curiosamente, nunca lee ~/.bashrcen shells de inicio de sesión).

Por lo general, ~/.profilecontiene definiciones de variables de entorno y puede iniciar algunos programas que desea ejecutar una vez al iniciar sesión o para toda la sesión; ~/.zshrccontiene cosas que deben hacerse para cada instancia de shell, como alias y definiciones de funciones, configuraciones de opciones de shell, configuraciones de finalización, configuraciones de solicitud, enlaces de teclas, etc.

Gilles
fuente
¡Gran respuesta! Creé ~ / .zprofile y puse la línea como sugeriste, pero parece que no hace nada. Tal vez debería ponerlo en .zshrc?
shmichael
1
@shmichael: Dada su reacción, es posible que no haya interpretado su pregunta de la manera en que lo hizo. ¿Ayuda la segunda sección que he agregado a mi respuesta?
Gilles
Sí, da en el clavo. Entonces, si entiendo correctamente, me gustaría, por ejemplo, declaraciones PATH en .zprofile y alias en .zshrc.
shmichael
@ user1419674 Gracias por la corrección, pero no agregue un registro de cambios a las publicaciones. El sitio tiene un historial de revisiones incorporado.
Gilles
69

Respuesta corta para personas impacientes:

  1. ~/.profileno está cargado por zshal iniciar la 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 excelente respuesta de Gilles!

Karl Morrison
fuente
Gran respuesta. Justo lo que necesitas.
Django Reinhardt
21

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

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

... que generará el archivo .profile con el modo sh de zsh en efecto. Y solo está activo durante la fuente. Por lo tanto, no tiene que guardar el estado de la opción actual para volver a reproducirlo después del abastecimiento.

Frank Terbeck
fuente
Tengo esto en mi ~ / .zprofile, pero por alguna razón las declaraciones en ~ / .profile no están disponibles en mi shell. Ubuntu 15.04; zsh 5.0.7
friederbluemle
Difícil de diagnosticar sin código.
Frank Terbeck
Acabo de intentarlo de nuevo, y parece que está funcionando ahora. No estoy seguro si se solucionó en algún momento o qué sucedió. La versión de zsh es 5.1.1 ahora.
friederbluemle
5

Tengo .zprofilecompatibilidad con .profile(contiene solo cambios de RUTA), por lo tanto solo necesito:

ln -s .profile .zprofile
Igor Shubovych
fuente
0

El zsh documentación que tengo a mano sólo menciona /etc/profiley ~/.profilepara shells de entrada en sh / ksh modo 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 se usa ~/.profile( ~/.zprofileaunque lo hará ):

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

(ninguna salida)

sh / ksh de compatibilidad conchas modo de inicio de sesión utiliza .profile:

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