您误会的一件事是/etc/environment
需要重新启动才能重新加载。这是不正确的。激活PAM堆栈时,特别是在读取文件时,只有在登录时才pam_env.so
读取文件。
注销并重新登录将应用更改–实际上,如果希望所有进程都接收新环境,则必须执行此操作。所有其他“解决方案” 2只会将环境应用于单个shell进程,而不应用于您通过GUI启动的任何程序,包括新的终端窗口。1个
不过,如果您对此感到满意,export
可以使用set -a
和来弥补命令的不足set +a
。但是,它仍然是一种糟糕的方法,因为文件也不使用引号。但这应该可以正常工作:
while read -r env; do export "$env"; done
1 GNOME会话管理器提供了一种更改其自身环境的方法,但仅在此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
。