Ожидание события ИЛИ пользователь прервать в оболочке - PullRequest
0 голосов
/ 26 июня 2019

Я пишу сценарий оболочки (zsh), который использует dialog(1) для рисования причудливого текстового интерфейса.

Есть место, где мне нужно подождать, пока произойдет одно из следующих событий:

  • внешнее событие (я опрашиваю функцию оболочки, которая обычно возвращает false; я хочу прекратить ждать, когда она вернет true);
  • пользователь нажимает кнопку «Отмена» в диалоговом окне (при этом диалоговое окно идеально показывает, сколько осталось до истечения времени ожидания);
  • тайм-аут.

Сочетание тайм-аут + опрос легко; тем не менее, я ничего не получу с dialog(1).

Я могу показать датчик, который подсчитывает время ожидания ожидания тайм-аута или внешнего события, но в диалоговом окне датчика нет элементов управления, нет кнопки отмены.

Или я могу показать диалоговое окно паузы, в котором есть обратный отсчет и кнопка отмены (при --nook кнопка ОК отсутствует), но если я запускаю такой диалог, он будет продолжать работать до истечения времени ожидания или до пользователь нажимает кнопку отмены, даже если внешнее событие происходит в это время.

Я могу запустить dialog --pause в фоновом режиме, что позволило бы мне продолжать опрос для внешнего события и убить dialog, когда событие происходит, но тогда становится трудно отследить случай, когда dialog завершился.

Один из способов - запустить dialog как сопроцесс с coproc и продолжать проверять, есть ли сопроцесс еще там, но это не работает, потому что сопроцесс приостанавливается, если он пытается записать в tty , (На самом деле, это также может быть проблемой при запуске dialog в фоновом режиме.)

Как возможный ключ, я мог бы, вероятно, продолжать показывать какой-то виджет dialog с односекундным таймаутом в цикле, но, может быть, есть лучший способ?

1 Ответ

0 голосов
/ 26 июня 2019

грязное решение будет выглядеть так:

for i in {1..100}; do
    dialog --timeout 1 --ok-label Abort --msgbox "$[100-i] seconds to time out" 0 0 && break
    poll_event && break
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...