Bash读取并在输入后等待

问题描述 投票:0回答:1

在bash中,我想读取用户的按键输入,甚至在按下按键后也要等待。我用

read -n 1 -s -t 0.05 key

但是输入后它将停止等待。无论如何我都想等待0.05,然后将按下的第一键存储在可变键中。

bash wait
1个回答
0
投票

如注释中所指出,请使用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"
© www.soinside.com 2019 - 2024. All rights reserved.