web-dev-qa-db-ja.com

読む前に標準入力をクリア

次のbashスクリプトがあります。

# do some time consuming task here
read -p "Give me some input: " input

ご想像のとおり、「時間のかかるタスク」中にユーザーがランダムなキーを押すと、不要な入力も考慮されます。 readコマンドを発行する前にstdinをクリア(または少なくとも無視)するにはどうすればよいですか?

15
rabin

Stdinをクリアする方法はないと思いますが、(bashを使用して)入力を要求する前にそこにあるものを読み取って破棄できます

#do some time consuming task here
read -t 1 -n 10000 discard 
read -p "Give me some input: " input

これは標準入力を読み取り、タイムアウトが1秒ですが、標準入力に10000文字を超える場合は失敗します。 ncharsパラメータをどれだけ大きくできるかわかりません。

8
user35787

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
21
christophjaeger
read -d '' -t 0.1 -n 10000

これは、ユーザーが誤ってEnterキーを複数回押した場合、複数行の入力を読み取ります

6
Ram Natarajan

これは私にとってうまくいきました:

function clean_stdin()
{
    while read -e -t 0.1; do : ; done
}
5
pschichtel

Stdinが閉じているブロックに時間のかかるタスクを囲みます。

{
     # time consuming task
} <&-

read -p "Give me some input: " input
4
artistoex

Christophjaegerの回答に基づいて、入力が端末にエコーされないように-sを追加し、新しい行を待たないように-nを追加しました。

while read -r -t 0; do
    read -n 256 -r -s
done
4
Peter Sutton
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