[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

variable globale d'environnement



Bonjour à toutes et à tous.

J'utilise une Debian 8 (Jessie) avec lightdm et MATE.

Je cherchais un moyen de définir une variable, appelons la MA_VARIABLE et sa valeur : ma_valeur.

Si j'ai bien lu et compris toutes les documentations de ces dernières 72 heures (entre autres [1], [2], [3] et [4]), il y a plusieurs endroits où je peux définir ceci :

Côté système avec :
* /etc/profile
* /etc/profile.d/*
* /etc/environment
* /etc/bash.bashrc

Côté utilisateur :
* ~/.bash_profile
* ~/.bashrc
* ~/.profile
* ~/.pam_environment

Je cherche à définir cette variable de manière globale, c'est à dire pour le système et donc, pour tous les utilisateurs du système. Dehors donc les ~/.* .

Si j'ai bien compris :

- lorsque le processus 1 démarre, il regarde dans /etc/profile qui lui dit de regarder aussi les /etc/profile.d/*
- lorsque lightdm démarre, il regarde à nouveau dans /etc/profile (et donc aussi dans /etc/profile.d/*) puis dans /etc/environment

J'ai donc mis :
 MA_VARIABLE=ma_valeur.
 export MA_VARIABLE
dans /etc/profile

À partir de là, si je redémarre, et que j'arrive sous MATE, j'ai ces 2 choses :
 - avec le ALT-CTRL-F1 (c'est TTY1 ça, il me semble), alors "env |grep "MA_VARIABLE" me montre bien que ma variable est propagée ici. Pas de soucis.
 - si je lance un mate-terminal depuis MATE, le même "env |grep "MA_VARIABLE" ne me retourne rien.
Je trouve ça étrange puisque de mon point de vue, les définitions dans /etc/profile devraient s'appliquer partout.
Ceci dit, j'ai lu sur les différentes doc que ça n'est pas aussi simple.

Du coup, j'ai essayé de placer MA_VARIABLE dans /etc/environment puisque en censé lightdm lit ce fichier [4].
Marche pas non plus, même cas qu'au dessus.

Puis j'ai placé dans /etc/bash.bashrc :
 MA_VARIABLE=ma_valeur.
 export MA_VARIABLE
Et là, ça fonctionne.

Vu que les fichiers dans /etc/ sont utilisés pour tous les utilisateurs, je pense être arrivé à peu près à ce que je voulais. (Ceci dit, ça ne me semble pas très propre.)

Cependant, j'aimerai comprendre :
* pourquoi ça ne fonctionne pas simplement en mettant ma variable dans /etc/profile ?
  Pour ça, j'imagine que la réponse est "lightdm ne regarde pas dans /etc/profile" mais je ne l'ai pas lu sur la toile. Une confirmation serait chouette.
* pourquoi ça ne fonctionne pas simplement en mettant ma variable dans /etc/environment ?
  Ça, j'ai l'impression que c'est sensé fonctionner si j'en crois [4].


Si j'ai bien compris la gestion des variables, elles sont héritées de processus-parent en processus-enfant. Et si je suis juste dans ma compréhension, le démarrage (à partir d'init) se passe ainsi :

1a) init démarre et lance ce qui se trouve dans init.d - à ce stade, aucun environnement général n'est défini et les variables sont définies "en interne" par chaque script présent dans /etc/init.d/*
1b) puis init démarre le login text qui regarde dans /etc/passwd quel shell utiliser
1c) init lance le shell (dans mon cas, bash) et lit les fichiers de configuration suivants :
  * /etc/profile (définition globale)
  * ~/.bash_profile , ~/.bash_login et ~/.profile (définition par utilisateur, donc pas intéressant dans mon cas)

Ceci fait en sorte que les variables sont bien propagées dans mes TTY (en root et en utilisateur)

2a) init démarre lightdm qui est censé lire /etc/environment (configuration multi-user - donc, ça "aurait dû fonctionner" lorsque j'ai essayé de déclarer ma variable ici)
2b) lightdm démarre MATE (qui devrait donc aurait dû hériter de ce qu'il y avait dans /etc/environment )
2c) sous MATE, je démarre mate-terminal qui aurait dû hériter de MATE, donc de lightdm, et donc in fine, de /etc/environment

Il doit forcément y avoir quelque chose de faux dans mon raisonnement mais j'ai beau tourné et retourné les docs, je ne vois pas. Vos lumières seront appréciées ici.


Il me reste un deuxième point d'interrogation : MA_VARIABLE est bien propagée dans mes TTY et dans mes mate-terminal grâce aux configurations de /etc/profile et /etc/bash.bashrc . Ceci dit, il y a une petite voix qui me dit que, si mate-terminal n'a pas hérité automatiquement de MA_VARIABLE par son ascendance, et qu'il m'a fallu coller une deuxième fois cette variable dans le /etc/bash.bashrc , alors certainement que mon environnement MATE tout entier n'a pas hérité de cette variable et ne la connaît donc pas, ce qui m'embête car je cherche à définir cette variable de manière globale. Ceci étant, je suis bien nu su cette question car je ne sais pas comment vérifier si mon environnement de bureau (MATE) connaît cette variable ou pas. La logique où j'en suis arrivé me dit que non.

Merci d'avance pour vos lumières,
Olivier

PS : J'ai bien vu qu'il devait y avoir une possibilité de scripter quelque chose grâce aux /etc/lightdm/lightdm.conf et autres fichiers de conf de lightdm. Je regarderai certainement plus avant ces possibilités dans les jours qui viennent, mais j'aimerai vraiment comprendre pourquoi ça ne fonctionne pas avec /etc/environment. Serait-ce parce que lightdm serait lancé en root et donc la lecture de /etc/environment ne concernerait que root et pas les users ? Je n'ai rien lu de tel, mais ça pourrait expliquer cette situation.

Certaines documentations lues :
[1] https://wiki.debian.org/EnvironmentVariables
[2] https://help.ubuntu.com/community/EnvironmentVariables
[3] http://www.freedesktop.org/wiki/Software/LightDM/
[4] http://www.freedesktop.org/wiki/Software/LightDM/Design/


Reply to: