13

У меня есть следующий скрипт bash:

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

Теперь, как вы уже догадались, если пользователь нажимает некоторые случайные клавиши во время "трудоемкой задачи", нежелательный ввод также учитывается. Как очистить стандартный stdin (или, по крайней мере, игнорировать его) перед выполнением команды чтения?

7 ответов7

16

В 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
8

Я не думаю, что есть способ очистить стандартный ввод, но (с помощью bash) вы можете прочитать и удалить то, что есть, прежде чем запрашивать ввод

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

Это читает stdin и имеет тайм-аут 1 секунда, но не работает, если в stdin более 10000 символов. Я не знаю, насколько большой вы можете сделать параметр nchars.

5
read -d '' -t 0.1 -n 10000

Это читает несколько строк ввода, если пользователь случайно нажал ввод несколько раз

5

это хорошо сработало для меня:

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

Заключите трудоемкую задачу в блок, чей stdin закрыт:

{
     # time consuming task
} <&-

read -p "Give me some input: " input
3

Основываясь на ответе christophjaeger, я добавил -s чтобы ввод не выводился на терминал, и -n чтобы он не ожидал новой строки.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .