等待事件或用户在Shell中中止

时间:2019-06-26 17:30:25

标签: shell unix dialog

我正在编写一个外壳(zsh)脚本,该脚本使用dialog(1)绘制精美的文本UI。

在某个地方我需要等待以下情况之一发生:

  • 外部事件(我轮询通常返回false的shell函数;一旦返回true,我想停止等待);
  • 用户在对话框中按“中止”按钮(理想情况下,该对话框显示剩余多少,直到我们超时);
  • 超时。

超时+轮询组合很容易;但是,dialog(1)我什么都做不了。

我可以显示一个在等待超时或外部事件发生时递增的量规,但量规对话框没有控件,没有中止按钮。

或者我可以显示一个带有倒计时和一个取消按钮的暂停对话框(使用--nook时没有确定按钮),但是如果我这样启动对话框,它将一直运行直到超时结束或直到用户按下取消键,即使同时发生外部事件也是如此。

我可以在后台启动dialog --pause,这样我就可以继续轮询外部事件,并在事件发生时杀死dialog,但是很难抓住{{ 1}}退出。

一种解决方法是将dialog作为dialog的协同进程开始,并继续检查该协同进程是否仍然存在,但这不起作用,因为如果协同进程试图暂停,则该协同进程将被挂起写给tty。 (实际上,在后台运行coproc时也会出现问题。)

作为一种可能的错误,我可能会继续显示一些dialog小部件,且其循环超时为一秒,但是也许有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

一个笨拙的解决方案看起来像这样:

dialog