Shell-Script
如何忽略兩個“讀取”之間的鍵盤輸入緩衝區
當我執行一個腳本時
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'
如果您使用的是
bash
shell,那麼您可以通過一種簡單的方式嘗試使用幾乎為 0 的超時時間從輸入中讀取單個字元。如果讀取了任何內容,則返回 true,因此您需要再試一次。例如,將此函式放在腳本的開頭,並在 sleep 和以下內容之間呼叫它:flush(){ while read -N 1 -t 0.01 do : done }