Entorno de configuración correcta

15

Estoy usando zsh y gdm para ejecutar gnome. Hace algún tiempo descubrí que las variables no están establecidas correctamente. Por ejemplo, LANG / LC_ALL son incorrectos (en ""lugar de en_GB.UTF-8).

Lo dividí .zshrcen .zshrcy .profile. En este último, configuro las variables de entorno, pero ¿cómo puedo configurar las variables antes de que comience la sesión? Intenté algunas opciones ( .xinitrc, .xsessionrc) pero ninguna parecía funcionar.

Editar Para aclarar - Solía .profiley manual que lo adquirieron en .zshrc. No cambia la pregunta de todos modos.

Maciej Piechotka
fuente
¿ .profileNo está cargado en absoluto, o hay algo más que sobrescribe las variables locales? (Prueba a poner alguna otra variable, como export MACIEJ_PROFILE=yespara asegurarse. set -xEn .profilepuede ser una buena manera de comprobar lo que está siendo ejecutado en y después .profile, si se lee en absoluto.) No hay ningún punto en la obtención .profilede .zshrc.
Gilles 'SO- deja de ser malvado'
¿Es este un problema en las ventanas de terminal o en otro lugar? ¿Obtiene la configuración regional deseada cuando ejecuta ssh localhost zsh? ¿Qué hay de ssh localhost bash? Si bash está bien pero no es zsh, tal vez pones algo /etc/zshenvo ~/.zshenv(lo cual es casi siempre una mala idea).
Gilles 'SO- deja de ser malvado'
No, el shell funciona bien (antes y después de la división). El problema es que gnome-sessionno tiene este conjunto de variedades.
Maciej Piechotka

Respuestas:

21

La manera simple es inventar una máquina del tiempo, visitar a las diversas personas que idearon los archivos de inicio de shell y decirles que distingan claramente entre tres cosas:

  • configuración de sesión, por ejemplo, variables de entorno;
  • inicio de sesión, es decir, por ejemplo, iniciar un shell de línea de comandos o un administrador de ventanas o ejecutarlo startx;
  • inicialización de shell, p. ej., alias, solicitud, asociaciones de teclas.

No es demasiado difícil obtener sesión versus shell de una manera portátil: la inicialización del tiempo de inicio de sesión entra .profile(o .zprofile, o .login), la inicialización de shell entra .bashrco .zshrc. He escrito anteriormente acerca .bash_profile, zsh frente a otras conchas , más acerca de la portabilidad (sobre todo de golpe) , más sobre quién lee.profile .

Un problema pendiente es distinguir entre la configuración de la sesión y el inicio de la sesión. En la mayoría de los casos, ~/.profilese ejecuta cuando inicia sesión y puede duplicarse como ambos, pero hay excepciones:

  • Si su shell de inicio de sesión es (t) csh o zsh, ~/.loginy ~/.zprofilese obtiene en lugar de ~/.profile. Lo mismo ocurre con bash y ~/.bash_profile, pero esto se resuelve fácilmente mediante el abastecimiento ~/.profilede ~/.bash_profile.
  • Si inicia sesión con un administrador de pantalla (xdm, gdm, kdm, ...), si su ~/.profilelectura depende de la versión del programa, de su distribución (Linux o de otro tipo) y del tipo de sesión que elija.
    • Si cuenta con el administrador de visualización para iniciar una sesión por usted, .profiledebe establecer variables de entorno pero no iniciar una sesión (por ejemplo, un administrador de ventanas).
    • El archivo de configuración tradicional para las sesiones X es ~/.xsession, tanto la configuración de la sesión como el inicio de la sesión. Entonces el archivo puede ser esencialmente . ~/.xsession; . ~/.xinitrc. Algunas distribuciones fuente ~/.profileantes ~/.xsession. Las distribuciones modernas solo se originan ~/.xsessioncuando selecciona una sesión "personalizada" desde el administrador de visualización, y dicha sesión no siempre está disponible.
    • Su administrador de sesión puede tener su propia forma de establecer variables de entorno. (Esa es una parte opcional de su entorno de escritorio, elegido por usted a través de un archivo de configuración o seleccionando un tipo de sesión al iniciar sesión; no lo confunda con los scripts de inicio de sesión proporcionados por el administrador de pantalla, que se ejecutan bajo su usuario pero elegido en todo el sistema. Sí, es un desastre.)

En resumen, ~/.profilees el lugar adecuado para las variables de entorno. Si no se lee, intente obtenerlo ~/.xsession(e inicie sus programas X desde allí), o busque un método específico del sistema (que puede depender de su distribución, el administrador de pantalla si lo hay, el tipo de sesión si el administrador de pantalla y el entorno de escritorio o gerente de sesión).

Gilles 'SO- deja de ser malvado'
fuente
.xsessionfue el archivo que estaba buscando.
Maciej Piechotka
1
Estoy totalmente de acuerdo con todo excepto su resumen. No creo que hayas establecido este punto. Si sus .profilefuentes .bashrco similar, entonces se puede establecer de forma fiable las variables de entorno en .bashrclas sesiones no sólo inicio de sesión, pero para los nuevos proyectiles que necesitan diferentes configuraciones, por ejemplo, si se inicia una xtermde gnome-terminaly quiere diverso dircolors.
Mikel
@Mikel Si configura las variables de entorno, anularán .bashrcsu configuración anterior. Por ejemplo, si ha comenzado una instancia de Screen o Tmux con variables de entorno particulares, todo lo que configure .bashrcanulará esta configuración. LS_COLORSes un caso especial porque es realmente una configuración por terminal; idealmente debería ser configurado por el emulador de terminal, y configurarlo en un archivo shell rc es la mejor solución.
Gilles 'SO- deja de ser malvado'
1

En la documentación de Gentoo hay un artículo sobre la Guía de localización de Gentoo Linux . El Capítulo 3 trata sobre la configuración regional.

Por lo general, los usuarios solo configuran la variable LANG en forma global. Este ejemplo es para un entorno local alemán Unicode:

Listado de Código 3.1: Establecer la configuración regional predeterminada del sistema en /etc/env.d/02locale

LANG="en_GB.UTF-8"

En mi Gentoo LANGestá configurado en este archivo y todo funciona correctamente ...

pbm@tauri ~ $ cat /etc/env.d/02locale 
LANG="pl_PL.UTF-8"

pbm@tauri ~ $ locale
LANG=pl_PL.UTF-8
LC_CTYPE="pl_PL.UTF-8"
LC_NUMERIC="pl_PL.UTF-8"
LC_TIME="pl_PL.UTF-8"
LC_COLLATE="pl_PL.UTF-8"
LC_MONETARY="pl_PL.UTF-8"
LC_MESSAGES="pl_PL.UTF-8"
LC_PAPER="pl_PL.UTF-8"
LC_NAME="pl_PL.UTF-8"
LC_ADDRESS="pl_PL.UTF-8"
LC_TELEPHONE="pl_PL.UTF-8"
LC_MEASUREMENT="pl_PL.UTF-8"
LC_IDENTIFICATION="pl_PL.UTF-8"
LC_ALL=
pbm
fuente
Tenga en cuenta que la parte que citó está bien, pero la guía también recomienda establecer una variable de entorno .bashrc, lo cual es incorrecto (consulte mi respuesta y, en particular, superuser.com/questions/217431 ).
Gilles 'SO- deja de ser malvado'
Gracias por la información tan detallada ... :) Nunca he usado esa parte .bashrc - la configuración env.des más universal.
pbm
También es por sistema en lugar de por usuario. Prefiero mantener la configuración del sistema separada de la configuración del usuario.
Maciej Piechotka