Comment recharger / etc / environment sans redémarrer?

158

/etc/environmentest officiellement le bon endroit pour les variables d'environnement système. Mais comment puis-je recharger les assignations dans ce fichier sans redémarrer ou reloguer?

Fait assez intéressant, google ne m'aide pas ici, mis à part les dizaines de billets de blogs suggérant d'utiliser

source /etc/environment

ce qui ne fonctionnera évidemment jamais, car il /etc/environments’agit d’une liste d’assigments (une par ligne) et non d’ un script exécutable (d’où les exportcommandes manquantes dans /etc/environment...).

fgysin
la source
11
À l'échelle du système, je n'en ai aucune idée. Pour la session actuelle du shell, vous pouvez utiliser for line in $( cat /etc/environment ) ; do export $line ; donesi le format de fichier est key=value.
Daniel Beck
2
export
Ça
2
@lzkata: Si une variable est déjà exportée, il ne devrait pas être nécessaire de l'exporter à nouveau ... Si de nouvelles variables qui n'ont pas déjà été exportées sont ajoutées, le exportserait nécessaire ... (sans elle, il s'agit simplement d'une non normale -environnement dans le shell actuel, non disponible dans les processus enfants)
Gert van den Berg
@DanielBeck merci..plz ajoutez votre commentaire comme réponse!
Gadelkareem
ça marche aussi sur debian et centos?
Massimo

Réponses:

123

Une chose que vous vous trompez est qu’il /etc/environmentfaut un redémarrage pour recharger. Ceci est une erreur. La seule fois que le fichier est lu est lors de la connexion , lorsque la pile PAM est activée - en particulier pam_env.so, qui lit le fichier.

La déconnexion et le retour impliqueraient les modifications. En fait, vous devez le faire si vous voulez que tous vos processus reçoivent le nouvel environnement . Toutes les autres "solutions" 2 n'appliqueront l'environnement qu'au processus shell unique, mais pas à tout ce que vous lancez via l'interface graphique, y compris les nouvelles fenêtres de terminal. 1

Si cela vous exportconvient, le manque de commandes peut être compensé avec set -aet set +a. Cependant, cela reste un mauvais moyen, car le fichier n’utilise pas non plus les guillemets. Mais cela devrait bien fonctionner:

while read -r env; do export "$env"; done

1 GNOME Session Manager permet de modifier son propre environnement, mais uniquement pendant la Initializationphase suivante:

$ gdbus call -e -d org.gnome.SessionManager \
                -o /org/gnome/SessionManager \
                -m org.gnome.SessionManager.Setenv \
                "FOO" "bar"
Error: GDBus.Error:org.gnome.SessionManager.NotInInitialization: Setenv
    interface is only available during the Initialization phase

2 gdb n'est pas une solution, mais peut être utilisé parfois. Vous devez le joindre aux processus en cours d'exécution de votre gestionnaire de session (par exemple gnome-session), de votre gestionnaire de fenêtres (par exemple gnome-shellou openbox), de votre barre des tâches / de votre panneau éventuel (par exemple xfce4-panel) et généralement de tout autre élément susceptible d'exécuter des commandes. Pour chacun de ces processus, vous devez vous y attacher gdbpar PID, appeler la putenv()fonction à l'aide de p, puis détacher à l'aide de q:

$ sudo gdb -p $(pidof gnome-session)
GNU gdb (GDB) 7.7.1
[...]
Attaching to process 718
[...]
0x00007fc2cefed81d in poll () from /usr/lib/libc.so.6

(gdb) p putenv("FOO=bar")
$1 = 0

(gdb) p putenv("BAZ=qux")
$2 = 0

(gdb) q
A debugging session is active.
Quit anyway? (y or n) y
Detaching from program: /usr/bin/gnome-session, process 718

Notez que le débogueur met en pause le processus. Par conséquent, vous devez vous attacher aux gestionnaires de fenêtres de composition uniquement à partir d'un autre serveur virtuel (console virtuelle) ou via SSH, sinon l'écran se figerait.

En plus de cela, vous devez également mettre à jour l'environnement utilisé par dbus-daemon:

$ dbus-update-activation-environment --systemd FOO=bar BAZ=qux

Pour les systèmes plus anciens:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()
Grawity
la source
1
Je viens de tester en lisant -r env; exporte "$ env"; fait sur Ubuntu 16.04 et il erreurs. Voulez-vous plus de détails?
Frank
La while readméthode est lue depuis stdin, vous voulez donc probablement lui appliquer quelque chose (par exemple cat /etc/environment | while ...). Mais cela ne fonctionnera pas avec les fichiers d'environnement formatés ( key="value")
villasv
6

Ce n'est pas aussi complet que la réponse acceptée, mais si vous avez cité des variables dans vos /etc/environmentfichiers, les deux méthodes précédentes (qui utilisent d'une export $linemanière ou d'une autre) se tromperont et vous obtiendrez des valeurs entre guillemets.

  • Option 1: avec un fichier source temporaire

sed 's/^/export /' /etc/environment > /tmp/env.sh && source /tmp/env.sh

  • Option 2: avec inline for(merci @ tim-jones):

for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done

villasv
la source
4
Plus court: evalsed 's/^/export /' /etc/environment
Aaron McMillin
2
Version non-temporaire du fichier ci-dessus:for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
Tim Jones
7
Encore plus court: set -a; source /etc/environment; set +a;.
ulidtko