当我运行像这样的脚本时
read -n 1 -p 'Enter first variable: ' var1
if echo "${var1}" | grep -iq "^y"
then
echo "okay"
else
echo "not okay"
fi
sleep 2
read -n 1 -p 'Enter second variable: ' var2
if echo "${var2}" | grep -iq "^y"
then
echo "okay"
else
echo "not okay"
fi
如果我运行这段代码,在 2 秒内点击y然后点击,就会保存在缓冲区中并传递给下一个,这就是为什么它不等待并要求用户输入,它只是给出缓冲区中的密钥,即这里。nnread
Enter second variable:
n
为了让自己清楚,我在以下问题中用不同的词语解释我的问题,但问题只是一个。
如何停止将密钥缓冲到内存中?或者
如何忽略缓冲区中第二个变量的用户输入var2
?或者
如何在第一个和第二个之间禁用/忽略键盘输入,read
以便无论我在第一个之后的 2 秒内输入什么read
,它都不会作为第二个的输入read
答案1
您需要调用tcflush()
POSIX 函数来刷新待处理的输入。
例如:
perl -MPOSIX -e 'tcflush 0,0'
答案2
如果您使用的是bash
shell,那么您可以通过一种简单的方式尝试使用几乎为 0 的超时从输入中读取单个字符。如果读取了任何内容,则返回 true,因此您需要重试。例如,将此函数放在脚本的开头,并在睡眠和以下读取之间调用它:
flush(){
while read -N 1 -t 0.01
do :
done
}