解决这个问题,每次重新启动 gnome 时,我都需要DBUS_SESSION_BUS_ADDRESS
为所有 shell设置环境变量,而不需要重新启动 tmux(这种情况很常见)。tmux
我怎样才能最好地解决这个问题?
- 我无法干净地改变另一个进程的环境。
- 我不能向每个窗格发送命令
- 我可以在我的
PROMPT_COMMAND
.这意味着我需要按Enter才能运行 gnome 应用程序。这是丑陋和矫枉过正的。 - 我可以通过设置环境变量在每个命令之前执行一个命令,但这有点过分了。
还有另一种方法可以更干净地解决这个问题吗?
答案1
在这种特定情况下,不要让 Gnome 运行dbus-launch
来创建随机 D-Bus 地址,而是dbus-daemon
在 X 会话启动早期显式启动并给它一个固定地址,例如unix:path=~/.dbus-$HOSTNAME-$DISPLAY
.
鉴于中的信息错误报告,您甚至可以摆脱unset DBUS_SESSION_BUS_ADDRESS
并让应用程序从根窗口属性中找出总线地址。
在一般情况下,您的评估是正确的:您所拥有的只是不可靠的方法,例如ptrace
(可能会导致程序崩溃,或者由于 Apparmor 或 SELinux 等安全框架而无法工作)或注入 shell 命令(仅在窗格中有效)当前处于 shell 提示符下)。在每个 shell 提示符下运行命令(使用 zshpreexec
或 bash PROMPT_COMMAND
)至少不会有破坏东西的风险。
另一个解决方案是一个LD_PRELOAD
拦截getenv
调用的库。这也让人感觉有点矫枉过正。
最好的选择是让应用程序通过创建间接级别来完成工作:安排环境变量的值保持有效,并让应用程序以情境感知的方式解释它。让应用程序在根窗口属性中查找 D-Bus 总线地址就是这种方法的一个示例。