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?

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.


¡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!


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.


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

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...
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.