如何在 bash 脚本的 waitkey 函数中处理长按按钮?

How to handle a long press on button in a waitkey function of bash script?

我正在 bash 脚本中实现一个 "waitkey" 函数,它等待用户按下键盘上的按钮以继续。

但是,由于不同的人有不同的按下习惯,当人们长时间按下一个按钮时,我的脚本总是将这次长按视为多次单独按下。

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

是否可以这样修改我的代码: 因为两次单独点击之间的间隔必须大于2秒,这样如果按下按钮1.5秒,这次长按将不会被视为两次单独点击。

Edit: This SuperUser answer may help you with clearing the input before your wait for a key press: https://superuser.com/a/622205

要做你想做的事,你要么必须:

  • 在读取用户输入之前禁用按键重复。

  • 在接受新输入之前检测 KeyUp 事件。

简短回答:这在 Shell 内是不可能的。

长答案:这几乎是不可能的,而且肯定不可移植。

由于控制台和终端的工作方式,无法在任何 unix tty 控制台环境中处理 keydown 和 keyup 事件,因此在 Bash 中也不行。

终端tty设备只处理字符流。

使用脚本执行您要求的操作需要对键盘设备进行低级别访问。

有办法在本地完成,但这绝对不是小事,依赖于 X-Window 协议或对键盘设备的本地和特权访问。

我找到了这篇详细的博客 post 如果您想了解更多为什么很难检测到 Linux 上的 KeyUp 事件,您可以阅读:

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