如何在 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/
我正在 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/