2011-09-25 11:27:43 +0000 2011-09-25 11:27:43 +0000
163
163
Advertisement

再起動せずに /etc/environment をリロードするには?

Advertisement

/etc/environment公式に システム全体の環境変数のための正しい場所です。

興味深いことに、グーグルはここでは何の助けにもなりません。

Advertisement

回答 (2)

126
126
126
2011-09-25 14:52:06 +0000

一つ勘違いしているのは、/etc/environmentは再起動しないとリロードできないということです。これは正しくありません。ファイルが読み込まれるのはログイン時だけで、PAM スタックが起動されているときだけです(特に pam_env.so はファイルを読み込んでいます)。他のすべての “ソリューション "2 は、単一のシェルプロセスにのみ環境を適用しますが、新しいターミナルwindows.1

を含む GUI を通して起動するものには適用されません。しかし、ファイルはどちらも引用符を使用していないので、それはまだ貧しい方法のままです。しかし、これはうまく動作するはずです:

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

1 GNOME セッションマネージャは、それ自身の環境を変更する方法を提供していますが、export の段階でのみ:

$ 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 set -a は解決策ではありませんが、時々使用することができます。セッションマネージャ(例: set +a)、ウィンドウマネージャ(例: Initialization または gdb)、タスクバー/パネル(例: gnome-session)、そして一般的に何かを実行している可能性がある他のすべてのプロセスにそれをアタッチしなければなりません。これらの各プロセスに対して、gnome-shell を PID でアタッチし、openbox を使って xfce4-panel 関数を呼び出し、gdb を使ってデタッチする必要があります:

$ 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

デバッガはプロセスを一時停止することに注意してください。

_それに加えて、dbus-daemonによって使用される環境を更新する必要があります:

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

古いシステムのために:

$ gdbus call -e -d org.freedesktop.DBus \
                -o /org/freedesktop/DBus \
                -m org.freedesktop.DBus.UpdateActivationEnvironment \
                "{'FOO': 'bar', 'BAZ': 'qux'}"
()
6
6
6
2017-08-14 20:12:59 +0000

これは、受け入れられている答えほど包括的ではありませんが、もしあなたが/etc/environmentファイルに引用符で囲まれた変数を持っている場合、(何らかの方法でexport $lineを使用している)以前の方法は両方とも失敗してしまい、引用符で囲まれた値で終わることになります。

Advertisement
Advertisement