这绝非易事,而你需要更具体地说明您希望脚本如何响应键盘输入。
没有办法“锁定”键盘;用户可以继续按照他们认为合适的方式打孔。如果您是内容的钥匙要呼应,但你要输入被忽略,你可以这样做以下:
# Beware! Read the entire answer; don't just use this command
timeout 5 bash -c 'while :;do read -s -d ""; done'
的timeout
实用程序运行一个命令,杀死它时,指定的秒数已经过去;指定的数字可能是小数部分。围绕read
命令的循环是必需的,因为read
会在按下Enter键后立即终止; while :; do
是“永远循环”的标准成语。
timeout
命令是Gnu coreutils的一部分。如果你没有它,也许是因为你正在使用BSD衍生产品,你可能会找到其他选择。有一个FreeBSD命令,可能在其他BSD上可用,包括Mac OS X,名为timelimit
;我相信正确的调用是将timeout 5
替换为timelimit -t 5 -s9
,但我没有任何简单的测试方法。
您需要让read
命令立即实际读取输入,而不是等到按下Enter键。否则,在终止read
之后,键入的输入仍然可用于下一个命令。
有几种方法可以做到这一点。一种是使用-n 1
标志使read
在每个字符后返回;另一种方法是使用-d ""
将输入字符的末尾设置为NUL
,这会将读取置于一次一个字符模式。
此外,您可能想要抑制在读取循环中按下的键的回显。您可以通过将-s
标志添加到read
命令来做到这一点,但是当read
命令被中断时,将会产生副作用,使终端处于“无回声”模式。 [注1]
不幸的是,您可能会发现终端设置已被永久更改,因为read
被timeout
命令终止时,它没有机会恢复终端设置。所以你最终会得到一个终端,它不回应,不处理退格和其他行编辑命令,并且不遵守Ctrl-D等问题。
为避免此问题,您需要保存并恢复终端设置。你可以做到这一点的stty
命令,如下所示:
# Save the terminal settings
saved=$(stty -g)
# Ignore input for 5 seconds, suppressing echo
timeout 5 bash -c 'while :;do read -s -d ""; done'
# Restore the terminal settings
stty "$saved"
如果不抑制回声,你会发现你的输入提示可以在同一行上出现的忽视输入。您可避免通过输出一个“回车/擦除结束行的”前提示控制序列:
tput cr; tput el; read -p "Give me some input: "
使用while循环并计算时间。 –
请查看[editing-help](http://stackoverflow.com/editing-help)。 – Cyrus
这不是一件容易的事:这里不是你的程序,而是环境的工作方式:它缓冲输入,直到你的程序再次接受它为止。您可以尝试从输入中分离临时文件,但最简单的方法是实际读取并转储所有输入5秒钟。 – arkascha