在bash中,我想读取用户的按键输入,甚至在按下按键后也要等待。我用
read -n 1 -s -t 0.05 key
但是输入后它将停止等待。无论如何我都想等待0.05,然后将按下的第一键存储在可变键中。
如注释中所指出,请使用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"