質問: 再起動せずに/ etc / environmentをリロードする方法 /etc/environmentは 正式に システム全体の環境変数の正しい場所です。しかし、再起動や再ログインをせずに、このファイルの割り当てをireloadとするとどうなりますか。興味深いことに、十分な数のグーグルがここで私を助けてくれません。source /etc/environment /etc/environmentは割り当てのリスト(1行に1つ)であり、notは実行可能スクリプトであるため、これは明らかに動作しません(そのため、/etc/environmentにexportコマンドがありません...)。
回答: 間違っているのは、/etc/environmentをリロードするには再起動が必要なことです。これは間違っています。ファイルが読み込まれるのはログイン時のみです。これは、pamスタックがアクティブになったとき、具体的にはpam_env.soで、ファイルを読み込みます。ログアウトして再度ログインすると、変更が適用されます。実際、mustすべてのプロセスで新しい環境を受信する場合はこれを行ってください。他のすべての「ソリューション」2 環境は単一のシェルプロセスにのみ適用され、新しいターミナルウィンドウを含むguiから起動するものには適用されません。1ただし、それで問題ない場合は、exportコマンドの欠如をset -aおよびset +aで補うことができます。ただし、ファイルも引用符を使用しないため、依然として不十分な方法です。しかし、これはうまくいくはずです:while read -r env; do export "$env"; done 1 gnome session managerは、initializationフェーズでのみ、独自の環境を変更する方法を提供します。$ 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は解決策ではありませんが、時々使用できます。セッションマネージャー(例:gnome-session)、ウィンドウマネージャー(例:gnome-shellまたはopenbox)、タスクバー/パネル(例:xfce4-panel)、および一般的に何かを実行する可能性のある他のすべて。これらのプロセスごとに、gdbをpidでアタッチし、pを使用してputenv()関数を呼び出し、次に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 デバッガーはプロセスを一時停止するため、別のtty(仮想コンソール)またはssh経由でのみ合成ウィンドウマネージャーに接続する必要があります。そうしないと、画面がフリーズします。それに加えて 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'}" ()