Environnement correctement défini

15

J'utilise zsh et gdm pour exécuter gnome. Il y a quelque temps, j'ai découvert que les variables n'étaient pas définies correctement. Par exemple, LANG / LC_ALL sont incorrects ( ""au lieu de en_GB.UTF-8).

J'ai divisé le .zshrcen .zshrcet .profile. Dans ce dernier, j'ai défini les variables d'environnement, mais comment puis-je définir les variables avant le début de la session? J'ai essayé quelques choix ( .xinitrc, .xsessionrc) mais aucun ne semblait fonctionner.

Modifier Pour clarifier - je l'ai utilisé .profileet sourcé manuellement.zshrc . Cela ne change pas la question de toute façon.

Maciej Piechotka
la source
Votre .profilen'est -il pas chargé du tout, ou quelque chose d'autre écrase-t-il les variables locales? (Essayez de régler d'autres variables comme export MACIEJ_PROFILE=yespour se assurer. set -xEn .profilepeut être un bon moyen de vérifier ce qui est en cours d' exécution et après .profile, si elle a lu du tout.) Il n'y a pas de point dans l' approvisionnement à .profilepartir .zshrc.
Gilles 'SO- arrête d'être méchant'
Est-ce un problème dans les fenêtres des terminaux ou ailleurs? Obtenez-vous les paramètres régionaux souhaités lorsque vous exécutez ssh localhost zsh? Et alors ssh localhost bash? Si bash est ok mais pas zsh, peut-être que vous mettez quelque chose dans /etc/zshenvou ~/.zshenv(ce qui est à peu près toujours une mauvaise idée).
Gilles 'SO- arrête d'être méchant'
Non, le shell fonctionne correctement (avant et après la division). Le problème est que gnome-sessioncet ensemble de variables n'est pas disponible.
Maciej Piechotka

Réponses:

21

Le moyen le plus simple est d'inventer une machine à voyager dans le temps, de visiter les différentes personnes qui ont conçu les fichiers de démarrage du shell et de leur dire de bien distinguer trois choses:

  • configuration de session, par exemple variables d'environnement;
  • lancement de session, c'est-à-dire, par exemple, démarrage d'un shell de ligne de commande ou d'un gestionnaire de fenêtres ou exécution startx;
  • initialisation du shell, par exemple alias, invite, raccourcis clavier.

Il n'est pas trop difficile d'obtenir une session vs un shell correct d'une manière portable: l'initialisation au moment de la connexion va dans .profile(ou .zprofile, ou .login), l'initialisation du shell va dans .bashrcou .zshrc. Je l' ai déjà écrit au sujet .bash_profile, zsh par rapport à d' autres coquilles , plus sur la portabilité (surtout de bash) , plus sur qui lit.profile .

Un problème restant consiste à faire la distinction entre la configuration de la session et le lancement de la session. Dans la plupart des cas, il ~/.profileest exécuté lorsque vous vous connectez et peut doubler comme les deux, mais il existe des exceptions:

  • Si votre shell de connexion est (t) csh ou zsh, ~/.loginet ~/.zprofileprovient de la place de ~/.profile. Idem pour bash et ~/.bash_profile, mais cela est facilement résolu en s'approvisionnant ~/.profileauprès de ~/.bash_profile.
  • Si vous vous connectez sous un gestionnaire d'affichage (xdm, gdm, kdm,…), votre ~/.profilelecture dépend de la version du programme, de votre distribution (Linux ou autre) et du type de session que vous choisissez.
    • Si vous comptez sur le gestionnaire d'affichage pour démarrer une session pour vous, vous .profiledevez définir des variables d'environnement mais pas démarrer une session (par exemple un gestionnaire de fenêtres).
    • Le fichier de configuration traditionnel pour les sessions X est ~/.xsessionà la fois la configuration de la session et le lancement de la session. Le fichier peut donc être essentiellement . ~/.xsession; . ~/.xinitrc. Certaines distributions source ~/.profileavant ~/.xsession. Les distributions modernes ne se source que ~/.xsessionlorsque vous sélectionnez une session «personnalisée» dans le gestionnaire d'affichage, et une telle session n'est pas toujours disponible.
    • Votre gestionnaire de session peut avoir sa propre façon de définir les variables d'environnement. (C'est une partie facultative de votre environnement de bureau, choisie par vous via un fichier de configuration ou en sélectionnant un type de session lors de la connexion; ne le confondez pas avec les scripts de démarrage de session fournis par le gestionnaire d'affichage, qui sont exécutés sous votre utilisateur mais choisi à l'échelle du système. Oui, c'est un gâchis.)

En résumé, ~/.profilec'est le bon endroit pour les variables d'environnement. S'il n'est pas lu, essayez de le rechercher ~/.xsession(et démarrez vos programmes X à partir de là), ou recherchez une méthode spécifique au système (qui peut dépendre de votre distribution, du gestionnaire d'affichage le cas échéant, du type de session si le gestionnaire d'affichage et de l'environnement de bureau ou gestionnaire de session).

Gilles 'SO- arrête d'être méchant'
la source
.xsessionétait le fichier que je cherchais.
Maciej Piechotka
1
Je suis entièrement d'accord avec tout sauf votre résumé. Je ne pense pas que vous ayez établi ce point. Si vos .profilesources .bashrcou similaires, vous pouvez définir des variables d'environnement de manière fiable .bashrcnon seulement pour les sessions de connexion, mais aussi pour les nouveaux shells qui nécessitent des paramètres différents, par exemple si vous démarrez un xtermdepuis gnome-terminalet que vous voulez différent dircolors.
Mikel
@Mikel Si vous définissez des variables d'environnement dans .bashrc, elles remplaceront vos paramètres précédents. Par exemple, si vous avez démarré une instance Screen ou Tmux avec des variables d'environnement particulières, tout ce que vous définissez .bashrcremplacera ces paramètres. LS_COLORSest un cas spécial car c'est vraiment un paramètre par terminal; idéalement, il devrait être défini par l'émulateur de terminal, et le définir dans un fichier shell rc est une solution de contournement.
Gilles 'SO- arrête d'être méchant'
1

Dans la documentation Gentoo, il y a un article Gentoo Linux Localization Guide . Le chapitre 3 concerne la configuration des paramètres régionaux.

Le plus souvent, les utilisateurs définissent uniquement la variable LANG sur une base globale. Cet exemple concerne un environnement local allemand unicode:

Exemple de code 3.1: définir les paramètres régionaux par défaut du système dans /etc/env.d/02locale

LANG="en_GB.UTF-8"

Dans mon Gentoo LANGest défini dans ce fichier et tout fonctionne correctement ...

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
la source
Méfiez-vous que la partie que vous avez citée est correcte, mais le guide recommande également de définir une variable d'environnement dans .bashrc, ce qui est faux (voir ma réponse et en particulier superuser.com/questions/217431 ).
Gilles 'SO- arrête d'être méchant'
Merci pour ces informations si détaillées ... :) Je n'ai jamais utilisé cette partie .bashrc - les paramètres env.dsont plus universels.
pbm du
C'est également par système au lieu de par utilisateur. Je préfère garder les paramètres système séparés des paramètres utilisateur.
Maciej Piechotka