如何忽略两个“read”之间的键盘输入缓冲区

如何忽略两个“read”之间的键盘输入缓冲区

当我运行像这样的脚本时

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然后点击,就会保存在缓冲区中并传递给下一个,这就是为什么它不等待并要求用户输入,它只是给出缓冲区中的密钥,即这里。nnreadEnter second variable:n

为了让自己清楚,我在以下问题中用不同的词语解释我的问题,但问题只是一个。

如何停止将密钥缓冲到内存中?或者

如何忽略缓冲区中第二个变量的用户输入var2或者

如何在第一个和第二个之间禁用/忽略键盘输入,read以便无论我在第一个之后的 2 秒内输入什么read,它都不会作为第二个的输入read

答案1

您需要调用tcflush()POSIX 函数来刷新待处理的输入。

例如:

perl -MPOSIX -e 'tcflush 0,0'

答案2

如果您使用的是bashshell,那么您可以通过一种简单的方式尝试使用几乎为 0 的超时从输入中读取单个字符。如果读取了任何内容,则返回 true,因此您需要重试。例如,将此函数放在脚本的开头,并在睡眠和以下读取之间调用它:

flush(){
  while read -N 1 -t 0.01
  do :
  done
}

相关内容