Question Comment recharger / etc / environment sans redémarrer?


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

Il est intéressant de noter que Google ne m'aide pas ici, à part les dizaines de billets de blog suggérant d'utiliser

source /etc/environment

qui va évidemment ne travaille jamais car /etc/environment est une liste des affectations (une par ligne) et ne pas un script exécutable (d'où le manque export commandes dans /etc/environment ...).


132
2017-09-25 11:27


origine


À l'échelle du système, je n'en ai aucune idée. Pour la session shell en cours, vous pouvez utiliser for line in $( cat /etc/environment ) ; do export $line ; done, si le format de fichier est key=value. - Daniel Beck♦
Fonctionne pour moi sans export... - Izkata
@lzkata: Si une variable est déjà exportée, il ne devrait pas être nécessaire de l'exporter à nouveau ... Si une nouvelle variable qui n'a pas encore été exportée est ajoutée, la export serait nécessaire ... (sans elle c'est juste une variable non-environnement normale dans le shell actuel, non disponible dans les processus enfants) - Gert van den Berg
@DanielBeck merci..plz ajoutez votre commentaire comme réponse! - Waleed Gadelkareem
ça marche aussi sur debian et centos? - Massimo


Réponses:


Une chose dont vous vous trompez est que /etc/environment nécessite un redémarrage pour recharger. Ceci est une erreur. La seule fois où le fichier est lu est à la connexion, lorsque la pile PAM est activée - en particulier pam_env.so, qui lit le fichier.

Déconnexion et retour appliqueraient les modifications - et en fait vous doit Faites ceci si vous voulez que tous vos processus reçoivent le nouvel environnement. Toutes les autres "solutions"2 appliquera uniquement l'environnement au processus shell unique, mais pas à tout ce que vous lancerez via l'interface graphique, y compris les nouvelles fenêtres de terminal.1

Si cela vous convient, le manque de export les commandes peuvent être compensées avec set -a et set +a. Cependant, il reste toujours un mauvais moyen, car le fichier n'utilise pas non plus de 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 Initialization phase:

$ 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 parfois être utilisée. Vous devez l'attacher aux processus en cours de votre gestionnaire de session (par ex. gnome-session), votre gestionnaire de fenêtres (par ex. gnome-shell ou openbox), votre barre des tâches / panneau, le cas échéant (par ex. xfce4-panel), et généralement tout ce qui pourrait éventuellement fonctionner. Pour chacun de ces processus, vous devez joindre gdb à elle par PID, invoquer le putenv() fonction en utilisant p, puis détachez en utilisant 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 interrompt le processus, par conséquent, vous devez attacher aux gestionnaires de fenêtres de composition uniquement à partir d'un autre tty (console virtuelle) ou sur SSH, sinon l'écran se figerait.

En plus de ça, 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'}"
()

103
2017-09-25 14:52



Je viens de tester en lecture -r env; exporte "$ env"; fait sur Ubuntu 16.04 et les erreurs. Voulez-vous plus de détails? - Frank
le while read la méthode lit à partir de stdin, donc vous voulez probablement y ajouter quelque chose (par ex. cat /etc/environment | while ...). Mais cela ne fonctionnera pas avec les fichiers d’environnement au format citation (key="value") - villasv


Ceci n'est pas aussi complet que la réponse acceptée, mais si vous avez cité des variables dans votre /etc/environment fichiers des deux méthodes précédentes (qui utilisent export $line en quelque sorte) ira mal et vous vous retrouvez avec des valeurs cotées.

  • 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


5
2017-08-14 20:12



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