/etc/environment
是正式对全系统的环境变量的正确位置。但是,如何在不重新启动或重新记录的情况下重新加载此文件中的作业?
有趣的是,除了数十篇建议使用的博客文章外,谷歌对我没有帮助
source /etc/environment
这显然是行不通的,因为它/etc/environment
是一份配置列表(每行一个),而不是可执行脚本(因此...中缺少的export
命令/etc/environment
)。
您误会的一件事是/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'}"
()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句