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

如何在不重启的情况下重新加载/etc/environment?

/etc/environment官方系统环境变量的正确位置。但我如何才能重载这个文件中的任务,而不需要重启或重新登录?

有趣的是,google并没有帮到我,除了几十篇博文建议使用

source /etc/environment

,显然,这显然是不可能的,因为/etc/environment是一个任务列表(每行一个),而不是**可执行的脚本(因此export中缺少/etc/environment命令………)。

答案 (2)

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

你有一点是错误的,那就是/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)、窗口管理器(如Initializationgdb)、任务栏/面板(如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'}"
()
6
6
6
2017-08-14 20:12:59 +0000

这并不像公认的答案那样全面,但是如果你在你的/etc/environment文件中引用了变量,那么之前的两种方法(使用export $line的方法)都会出错,你最终会得到引用的值。