我正在做以下事情(这只是一个例子,逗号更复杂):
xterm -fa "Inconsolata" -e tmux new-session -s alpha &
disown %%
tmux new-window -t alpha bash
tmux new-window -t alpha zsh
...当我在终端中输入它时,效果非常好,为我提供了一个带有三个窗口的 tmux 会话的 xterm。但是如果我把这个东西放入脚本中,它将停止工作;
no server running on /tmp/tmux-1153/default
no server running on /tmp/tmux-1153/default
错误,并且新tmux
会话中只有一个窗口alpha
。
经过一些实验,我发现它将要如果我添加一个,再次工作
sleep 5
(或类似)在disown
和tmux new-window
命令之间。显然,在运行此命令之前 xterm 尚未完成设置,因此tmux new-window
在创建会话之前运行,除非我在那里设置延迟。
它可以工作,但并不优雅。有没有办法告诉tmux
等待会话alpha
结束?
答案1
您可以通过两种方式执行此操作:
使用该
sleep
方法。我认为使用没有什么问题,sleep
除了有时会因为选择太短的时间而失败之外。为了万无一失,请使用while ! tmux has-session; do sleep 1; done
或者
while ! tmux has-session -t alpha; do sleep 1; done
使用类似的东西
xtoolwait
它在后台启动 X 客户端(您的终端仿真器),并在映射其窗口后返回。
如果您选择第二个选项(这可能是最好的),请记住删除&
启动终端的命令末尾的 ,并且它对于disown
工作来说也变得不必要。
命令变为:
xtoolwait xterm -fa "Inconsolata" -e tmux new-session -s alpha
tmux new-window -t alpha bash
如果xtoolwait
尚未安装在您的 Unix 上,它可能会作为软件包提供(它已经存在了很长时间)年龄)。使用您选择的包管理器来安装它。
编辑tmux
:从评论来看,即使xtoolwait
正在使用终端,在映射其窗口后似乎也需要很长时间才能生成。因此,在这种情况下,我会循环调用,sleep 1
直到tmux
存在所需的会话。