如注释中所指出,使用sleep
。在sleep
期间输入的所有内容都将打印在终端上(就像不消耗stdin的每个命令一样)。使用stty
隐藏此输出。
-
stty -echo
禁用输出。
-
stty echo
启用输出(将显示到目前为止隐藏的未使用字符)。
您可能只想等待剩余时间,而不要再等待0.05秒。有两种方法可以这样做:
简单但可能不可靠的方法
使用sleep
之前 read
–这样,您既不必测量等待时间,也不必计算剩余时间:
stty -echo
sleep 0.049
read -n1 -s -t0.001 key;
stty echo;
echo "key was $key"
read -t…
超时必须足够长才能实际读取缓冲的字符。您可以通过将很长的行复制粘贴到终端中来进行测试-read
仅会读取其中的一部分。在速度较慢的系统上,您可能必须增加0.001
。但是请记住,用户的总等待时间可能只是睡眠时间,也就是说,-t
越大意味着精度越低。
复杂但强大的方法
要解决该问题,您可以将sleep
放在 read
之后并计算剩余的等待时间,这当然是更多的工作。这是bash
5.0或更高版本中的解决方案:
# all variables of the form tSomething are in μs = 10^-6 s
stty -echo
tStart="${EPOCHREALTIME/./}"
read -n1 -s -t0.05 key;
tEnd="${EPOCHREALTIME/./}"
printf -v tWait %07d "$((tStart + 50000 - tEnd))" # 50000 μs = 0.05 s
sleep "${tWait:: -6}.${tWait: -6}"
stty echo
echo "key was $key"
本文链接:https://www.f2er.com/3132237.html