Как справиться с долгим нажатием на кнопку в функции ожидания bash-скрипта? - PullRequest
2 голосов
/ 01 октября 2019

Я реализую функцию "waitkey" в bash-скрипте, которая ждет, когда пользователь нажмет кнопку на клавиатуре, чтобы продолжить.

Однако, поскольку разные люди имеют разные привычки нажатия, когда люди нажимают кнопку в течение длительного времени, мой сценарий всегда рассматривает это длительное нажатие как несколько отдельных нажатий.

waitkey() {
   read -n 1 -s -r -p "Press any key to continue"
}

Возможно ли эточтобы изменить мой код следующим образом: интервал между двумя отдельными щелчками должен превышать 2 секунды, чтобы при нажатии кнопки в течение 1,5 секунд это длительное нажатие не рассматривалось как два отдельных щелчка.

1 Ответ

0 голосов
/ 01 октября 2019

Редактировать: Этот ответ SuperUser может помочь вам очистить ввод перед ожиданием нажатия клавиши: https://superuser.com/a/622205

Чтобы сделать то, что вы хотите, вы должны либо:

  • Отключение повторения клавиши перед чтением пользовательского ввода.

или

  • Обнаружение события KeyUp перед принятием нового ввода.

Краткий ответ: это невозможно в командной консоли.

Длинный ответ: в большинстве случаев это невозможно и, конечно, не переносимо.

Нет средств для обработки событий нажатия клавиш и нажатия клавиш. в любой консольной среде Unix tty, а не в Bash, из-за того, как работают консоли и терминалы.

Терминальное устройство tty работает только с символьными потоками.

Выполнение того, что вы запрашиваете с помощью своегоСценарий требует низкоуровневого доступа к устройству клавиатуры.

Существуют способы сделать это локально, но это совершенно не тривиально, полагаться на протокол X-Window или локальный и привилегированный доступ к устройству клавиатуры.

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

https://blog.robertelder.org/detect-keyup-event-linux-terminal/

...