間違っているのは、/etc/environment
リロードするために再起動が必要なことです。これは間違っています。ファイルが読み取られるのは、ログイン時、PAMスタックがアクティブになったとき、特にpam_env.so
ファイルを読み取るときだけです。
ログアウトして再度ログインすると、変更が適用されます。実際、すべてのプロセスが新しい環境を受け取るようにするには、これを行う必要があります。他のすべての「ソリューション」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で接続し、をputenv()
使用して関数を呼び出しp
、次にを使用してデタッチする必要があります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'}"
()
for line in $( cat /etc/environment ) ; do export $line ; done
は、ファイル形式がの場合、を使用できますkey=value
。