읽기 전에 명확한 stdin “Give me some

다음 bash 스크립트가 있습니다.

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

짐작 하셨겠지만, “시간이 걸리는 작업”중에 사용자가 임의의 키를 누르면 원하지 않는 입력도 고려됩니다. stdinread 명령을 실행하기 전에 어떻게 지우 거나 최소한 무시합니까?



답변

stdin을 지우는 방법이 없다고 생각하지만 (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 매개 변수를 얼마나 크게 만들 수 있는지 모르겠습니다.


답변

Bash 4에서는 -t(timeout)을로 설정할 수 있습니다 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