Я пишу сценарий оболочки (zsh), который использует dialog(1)
для рисования причудливого текстового интерфейса.
Есть место, где мне нужно подождать, пока произойдет одно из следующих событий:
- внешнее событие (я опрашиваю функцию оболочки, которая обычно возвращает false; я хочу прекратить ждать, когда она вернет true);
- пользователь нажимает кнопку «Отмена» в диалоговом окне (при этом диалоговое окно идеально показывает, сколько осталось до истечения времени ожидания);
- тайм-аут.
Сочетание тайм-аут + опрос легко; тем не менее, я ничего не получу с dialog(1)
.
Я могу показать датчик, который подсчитывает время ожидания ожидания тайм-аута или внешнего события, но в диалоговом окне датчика нет элементов управления, нет кнопки отмены.
Или я могу показать диалоговое окно паузы, в котором есть обратный отсчет и кнопка отмены (при --nook
кнопка ОК отсутствует), но если я запускаю такой диалог, он будет продолжать работать до истечения времени ожидания или до пользователь нажимает кнопку отмены, даже если внешнее событие происходит в это время.
Я могу запустить dialog --pause
в фоновом режиме, что позволило бы мне продолжать опрос для внешнего события и убить dialog
, когда событие происходит, но тогда становится трудно отследить случай, когда dialog
завершился.
Один из способов - запустить dialog
как сопроцесс с coproc
и продолжать проверять, есть ли сопроцесс еще там, но это не работает, потому что сопроцесс приостанавливается, если он пытается записать в tty , (На самом деле, это также может быть проблемой при запуске dialog
в фоновом режиме.)
Как возможный ключ, я мог бы, вероятно, продолжать показывать какой-то виджет dialog
с односекундным таймаутом в цикле, но, может быть, есть лучший способ?