如何在不重启的情况下重新加载/etc/environment?
/etc/environment
是官方系统环境变量的正确位置。但我如何才能重载这个文件中的任务,而不需要重启或重新登录?
有趣的是,google并没有帮到我,除了几十篇博文建议使用
source /etc/environment
,显然,这显然是不可能的,因为/etc/environment
是一个任务列表(每行一个),而不是**可执行的脚本(因此export
中缺少/etc/environment
命令………)。
/etc/environment
是官方系统环境变量的正确位置。但我如何才能重载这个文件中的任务,而不需要重启或重新登录?
有趣的是,google并没有帮到我,除了几十篇博文建议使用
source /etc/environment
,显然,这显然是不可能的,因为/etc/environment
是一个任务列表(每行一个),而不是**可执行的脚本(因此export
中缺少/etc/environment
命令………)。
你有一点是错误的,那就是/etc/environment
需要重启才能重装。这是不正确的。唯一读取文件的时间是on login,当PAM堆栈被激活时–特别是pam_env.so
,读取文件。所有其他的 “解决方案 "2 只会将环境应用到单一的shell进程,而不会应用到任何你通过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
),以及其他可能会运行的东西,一般情况下,都要把它附加到运行中的进程中。对于每一个进程,你需要通过PID将gnome-shell
附加到它,使用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
注意,调试器会暂停进程,因此你必须通过另一个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'}"
()