运行 在新后台 tmux 命令 window 并等待进程完成

Run command in new background tmux window and wait for process to finish

我正在尝试在脚本中使用 tmux,以便它在新的隐藏窗格中运行需要一些时间的命令(例如 'ping -c 5 8.8.8.8'),同时阻止当前脚本本身直到 ping 结束。

"hidden pane",我的意思是 运行 将在后台发送的新窗格中的命令,并且仍然可以通过切换窗格访问以监视 and/or 与其交互(不一定是 ping)。
(参见编辑)

下面是一些伪 bash 代码,可以更清楚地显示我正在尝试做的事情:

echo "Waiting for ping to finish..."
echo "Ctrl-b + p to switch pane and see running process"

tmux new-window -d 'ping -c 5 8.8.8.8' # run command in new "background" window
tmux wait-for                          # display "Done!" only when ping command has finished

echo "Done!"

我知道这里的 tmux 命令实际上没有任何意义,但这只是为了说明。

我查看了不同的解决方案,以便在后台发送命令,或者等到进程在另一个窗格中完成,但我仍然没有找到正确执行这两种操作的方法。

编辑

感谢 Nicholas Marriott 指出在创建新 window 时存在 -d 选项以避免自动切换到它。现在唯一的问题是在命令结束之前阻止主脚本。

我尝试了以下方法,希望它能起作用,但它也不起作用(脚本没有恢复)。

tmux new-window -d 'ping -c 5 8.8.8.8; tmux wait -S ping' &
tmux wait $!

也许有一个玩进程的方法(使用fg,bg...),但我还是没弄明白。

类似问题:
[1] Make tmux block until programs complete
[2] Bash - executing blocking scripts in tmux
[3] How do you hide a tmux pane
[4]

你可以使用 wait-for 但你需要给它一个通道并在你的过程完成时向该通道发出信号,例如:

tmux neww -d 'ping blah; tmux wait -S ping'
tmux wait ping
echo done

如果您认为您可能 运行 脚本会并行运行几次,我建议使用 mktemp 或类似名称创建频道名称(并在 wait-for [=22 时删除文件=]).

wait-for 无法自动等待诸如窗格或 windows 退出、窗格中的静音等内容,但我希望在某个时候看到它的实现。