Définition d'une variable d'environnement global pour tout le monde

17

Si je définis une variable dans /etc/environment, elle ne semble s'appliquer qu'aux administrateurs pendant la période sudo su.

Comment puis-je obtenir que les variables s'appliquent à tout le monde? Surtout quand ils sont en terminal? Les paramètres /etc/enviromentne s'appliquent-ils pas à bash?

Mick.D
la source

Réponses:

13

La /etc/environmentmise à jour ne fonctionnera que sur la prochaine session, elle n'est pas automatiquement rechargée.

Ce qui signifie que vous ne pouvez pas le modifier pour les sessions qui ont déjà démarré pour d'autres utilisateurs.

Si vous voulez "recharger" tout ce qui se trouve dans la, /etc/environmentvous avez besoin de la commande suivante:

source /etc/environment

Mais encore une fois, cela ne fonctionnera que pour votre propre session en cours, les autres utilisateurs ne seront pas affectés jusqu'à ce qu'ils démarrent une nouvelle session ou exécutent la commande ci-dessus dans leur propre session.

Panthro
la source
4

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 sucomme 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/*.shet /etc/environmentd'ê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/profileet/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 bashrcn'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/profileou /etc/profile.d/my-custom-env.shou ~/.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

mattpr
la source
3

créer un script shell personnalisé sous

/etc/profile.d/

ajoutez vos variables d'environnement global dans votre script créé, redémarrez la machine, puis elle sera disponible pour tout le monde.

shalamus
la source
Je pense que c'est une approche plus fiable que la modification du fichier / etc / environment car ce fichier peut être modifié lors de la mise à jour des packages.
phreed
2

L'ajout d'une variable /etc/environmenta fonctionné pour moi.

Cependant, j'ai dû redémarrer après avoir changé /etc/environmentpour que la modification prenne effet. La simple fermeture et réouverture de la fenêtre du terminal n'était pas suffisante.

kris
la source
3
Vous pouvez toujours faire un source /etc/environmentpour le recharger.
Panthro
La déconnexion et la reconnexion devraient suffire.
Karuhanga