Shell-Script

如何忽略兩個“讀取”之間的鍵盤輸入緩衝區

  • July 26, 2017

當我執行一個腳本時

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

如果我執行此程式碼,y然後n在 2 秒內點擊,則將n保存在緩衝區中並提供給下一個read,這就是它不等待並要求使用者輸入的原因Enter second variable:,它只是在緩衝區中給出密鑰,即n此處.

為了讓自己清楚,我在以下問題中用不同的詞來解釋我的問題,但問題只是一個問題。

如何停止將密鑰緩衝到記憶體中?或者

如何忽略緩衝區中第二個變數的使用者輸入var2或者

如何在我的第一個和第二個之間禁用/忽略鍵盤輸入,read以便我在第一個之後的 2 秒內read輸入的任何內容都不會作為第二個的輸入read

您想呼叫tcflush()POSIX 函式來刷新待處理的輸入。

例如:

perl -MPOSIX -e 'tcflush 0,0'

如果您使用的是bashshell,那麼您可以通過一種簡單的方式嘗試使用幾乎為 0 的超時時間從輸入中讀取單個字元。如果讀取了任何內容,則返回 true,因此您需要再試一次。例如,將此函式放在腳本的開頭,並在 sleep 和以下內容之間呼叫它:

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

引用自:https://unix.stackexchange.com/questions/381938