TL; DR
Ces fichiers de configuration, qu'ils soient globaux ( /etc/environment
, /etc/profile
) ou spécifiques à l'utilisateur (~/.profile
, ~/.bashrc
), ne sont traités qu'à la prochaine connexion / session.
Les fichiers globaux s'appliquent à tous les utilisateurs (pas seulement root) ... mais vous devez redémarrer votre session de connexion pour voir les changements reflétés dans l'environnement. Cela peut se produire en appelant su
comme vous l'avez observé ... ou en vous déconnectant / connectant ou en redémarrant. Vous pourriezsu
à un utilisateur non root et vous verriez qu'ils ont également les changements d'environnement.
La raison pour laquelle vous devez redémarrer ou vous reconnecter pour récupérer l'environnement global est parce que l'environnement est hérité des processus parents et que le processus racine pour tout ce que vous exécutez est votre shell de connexion ... donc si votre shell de connexion n'a pas l'environnement ... puis les processus démarrés dans le shell de connexion non plus. Vous pouvez bien sûr définir / mettre à jour l'environnement pour des processus individuels lorsque vous les démarrez, mais vous devez définir l'environnement pour le shell de connexion et redémarrer tous les sous-processus pour qu'ils voient la modification.
Environnement global
Comme quelqu'un a mentionné, vous avez besoin d' un redémarrage ou déconnexion / connexion pour les modifications apportées à /etc/profile
, /etc/profile.d/*.sh
et /etc/environment
d'être pris en charge.
En effet, bien que ces fichiers spécifient un environnement global ... ils ne sont exécutés qu'une seule fois à la connexion et les connexions / sessions existantes ne refléteront donc pas les modifications apportées à ces fichiers. Un redémarrage "réinitialise" la connexion de chacun, les forçant à récupérer le nouvel environnement.
Dans votre propre session de connexion, vous pouvez source /etc/profile
afin de récupérer les modifications sans redémarrage ou déconnexion / connexion ... mais cela n'affectera que votre propre session et les nouveaux processus en cours d'exécution dans votre session.
Notez également qu'il n'y a pas d'interpolation variable dans /etc/environment
(ce n'est pas un script) donc vous ne pouvez pas faire des choses commePATH="$PATH:/my/custom/path"
.
Notez également que /etc/profile
et/etc/profile.d/*.sh
ne sont exécutés que pour les sessions de connexion et que l'environnement configuré n'est pas disponible pour les comptes système non connectés (c'est-à-dire si vous essayez de définir une variable d'environnement pour un processus démon qui s'exécute en dehors de votre shell de connexion).
Notez que ce bashrc
n'est pas utile pour définir l'environnement pour l'ensemble du shell de connexion mais pour les shells bash et les sous-processus ... donc pour un vrai "global" ou "utilisateur global" vous voudrez probablement mettre votre configuration d'environnement dans /etc/profile
ou /etc/profile.d/my-custom-env.sh
ou ~/.profile
. D'autres shells (par exemple zsh) ont leurs propres fichiers de configuration, de sorte que la configuration d'un environnement non spécifique à bash dans un bashrc causera des problèmes ou de la confusion si / lorsque vous changez de shell (ou si d'autres utilisateurs du système utilisent des shells différents).
Il est courant d'installer un nouveau programme et de spécifier un environnement pour qu'il fonctionne correctement. L'environnement mondial est une réponse, mais nécessitera souvent un redémarrage qui n'est pas idéal pour les serveurs et les cas d'utilisation de provisionnement / configuration automatique. Vous devez vous demander si c'est vraiment une variable dont tous les utilisateurs et programmes du système ont besoin ou si c'est vraiment quelque chose que vous devez mettre à la disposition d'un utilisateur ou d'un programme spécifique.
Pour un utilisateur spécifique
regardez inclure l'environnement dans le profil ou bashrc dans le répertoire personnel de l'utilisateur (par exemple ~/.profile
~/.bashrc
) selon que vous le souhaitez pour les shells de connexion interactifs, bash uniquement, etc.
Gardez à l'esprit que cela nécessite également un redémarrage ou une déconnexion / connexion pour que les modifications de l'environnement soient disponibles pour tous les processus dans la session de connexion de l'utilisateur. L'utilisateur peutsource ~/.profile
... mais cela se fait dans un terminal et ne met à jour que l'environnement dans cette session de terminal et les processus enfants ... pas nécessairement pour tout l'environnement de connexion de l'utilisateur.
Pour un programme spécifique, il existe quelques options.
L'une consiste simplement à fournir l'environnement lors de l'exécution de la commande:
VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2
Si vous utilisez systemd, vous pouvez également spécifier l'environnement dans le fichier unité / service sous [Service]
avecEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE
Cette option peut sembler maladroite car vous devez spécifier l'environnement à chaque fois que vous exécutez un programme, mais si l'environnement n'est vraiment nécessaire que par ce programme ... c'est vraiment la meilleure façon et vous devriez vous y habituer et ne pas tout vider dans un fichier bashrc ou profil.
Si vous n'utilisez pas systemd ou init pour configurer l'environnement et exécuter le programme ... alors bien sûr, vous pouvez également envelopper l'exécution du programme avec un script bash où vous enregistrez la commande complète, y compris la configuration de l'environnement pour plus de commodité.
Les références:
Il y a aussi une réponse très détaillée ici que je vous suggère de lire: /ubuntu//a/247769/824160