我注意到,我无法在 tmux 窗格中运行 steam:它给了我错误
Error: Unable to open a connection to X. Check your DISPLAY environment
variable and make sure that you have enabled X. If you are running
remotely, make sure that you have a remote connection which will allow
an X connection.
而同时在通常的终端中没有这样的问题。这让我得出结论,程序环境中存在一些差异,在从两个终端导出环境后,我是对的
$ env > /tmp/t1
$ env > /tmp/t2
并对其进行区分
$ diff -u /tmp/t{1,2}
我注意到 DBUS_SESSION_BUS_ADDRESS 有所不同
-DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-CX81GDMBcL,guid=712e96f4ecdc3b9bf1eca21254ed44e3
+DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-axu0HojvNi,guid=a28fcde62f6d40aa587c708a54b83924
这一定是因为我可以重新启动 X,而会话中的环境tmux
不会受到dbus-launch
在 ~/.xinitrc 中的 WM 启动命令中发生的影响:
eval exec ck-launch-session dbus-launch --sh-syntax --exit-with-session i3 &>/dev/null
那么,当地址改变时我该如何更新该变量?
答案1
/我真笨。当我检查它是否已在运行或是否应该启动时,我只需要在我的 tmux 窗口中的自动启动脚本中重新导出 DBUS_SESSION_BUS_ADDRESS。
因此我的 autorun.sh 中与 tmux 相关的部分现在如下所示:
tmux="tmux -u -f $HOME/.tmux/config -S $HOME/.tmux/socket"
if pgrep -u $UID -f '^tmux.*$' &>/dev/null; then
for pane in `$tmux list-windows -t0 | sed -r 's/^([0-9]+):.*/\1/g'`; do
$tmux send -t 0:$pane C-c
$tmux send -t 0:$pane export DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS" ENTER
$tmux send -t 0:$pane export DISPLAY="$DISPLAY" ENTER
$tmux send -t 0:$pane C-c
done
else $tmux \
new -d su \; \
set remain-on-exit on \; \
neww su \; \
set remain-on-exit on \; \
select-window -t 0:1
fi
第一个C-c
是在运行导出命令之前清除行中可能残留的内容。第二个是在之后清除行(tmux 或 bash 会将命令复制到命令行,我不知道为什么)