次のbashスクリプトがあります。
# do some time consuming task here
read -p "Give me some input: " input
ご想像のとおり、「時間のかかるタスク」中にユーザーがランダムなキーを押すと、不要な入力も考慮されます。 readコマンドを発行する前にstdin
をクリア(または少なくとも無視)するにはどうすればよいですか?
Stdinをクリアする方法はないと思いますが、(bashを使用して)入力を要求する前にそこにあるものを読み取って破棄できます
#do some time consuming task here
read -t 1 -n 10000 discard
read -p "Give me some input: " input
これは標準入力を読み取り、タイムアウトが1秒ですが、標準入力に10000文字を超える場合は失敗します。 ncharsパラメータをどれだけ大きくできるかわかりません。
Bash 4では、-t
(タイムアウト)から0
。この場合、read
はすぐに戻り、待機中のデータがあるかどうかを示す終了ステータスが表示されます。
# do some time consuming task here
while read -r -t 0; do read -r; done
read -p "Give me some input: " input
read -d '' -t 0.1 -n 10000
これは、ユーザーが誤ってEnterキーを複数回押した場合、複数行の入力を読み取ります
これは私にとってうまくいきました:
function clean_stdin()
{
while read -e -t 0.1; do : ; done
}
Stdinが閉じているブロックに時間のかかるタスクを囲みます。
{
# time consuming task
} <&-
read -p "Give me some input: " input
Christophjaegerの回答に基づいて、入力が端末にエコーされないように-s
を追加し、新しい行を待たないように-n
を追加しました。
while read -r -t 0; do
read -n 256 -r -s
done
function clear_stdin()
(
old_tty_settings=`stty -g`
stty -icanon min 0 time 0
while read none; do :; done
stty "$old_tty_settings"
)
clear_stdin