bash: 루프 내부에서 비차단 읽기

bash: 루프 내부에서 비차단 읽기

아래에 작은 bash 스크립트가 있습니다

var=a

while true :
do
    echo $var
    sleep 0.5
    read -n 1 -s var
done

사용자가 입력한 문자를 인쇄하고 다음 입력을 기다립니다. 내가 원하는 것은 실제로 읽기를 차단하지 않는 것입니다. 즉, 0.5초마다 사용자가 입력한 마지막 문자를 인쇄하는 것입니다. 사용자가 키를 누르면 다음 키를 누를 때까지 계속해서 새 키를 인쇄해야 합니다.

어떤 제안이 있으십니까?

답변1

에서 help read:

  -t timeout    time out and return failure if a complete line of input is
        not read within TIMEOUT seconds.  The value of the TMOUT
        variable is the default timeout.  TIMEOUT may be a
        fractional number.  If TIMEOUT is 0, read returns immediately,
        without trying to read any data, returning success only if
        input is available on the specified file descriptor.  The
        exit status is greater than 128 if the timeout is exceeded

그러니 시도해 보세요:

while true
do
    echo "$var"
    IFS= read -r -t 0.5 -n 1 -s holder && var="$holder"
done

이는 변수 가 읽기 전용이 아닌 한(어차피 아무 소용이 없는 경우) 시간이 초과 되더라도 holder변수와 함께 사용하면 해당 내용을 잃기 때문에 사용됩니다 .readread

$ declare -r a    
$ read -t 0.5 a
bash: a: readonly variable
code 1

나는 이것을 막을 방법을 찾을 수 없습니다.

답변2

조금 늦었지만 (더 나은) 해결책은 다음과 같습니다.

while true ; do
    read -r -s -t 0.5; RETVAL=$?
    # ok? echo && continue
    [ $RETVAL -eq 0 ] && echo -E "$REPLY" && continue
    # no timeout ? (EOF or error) break
    [ $RETVAL -gt 128 ] || break
done

IMHO, 더 큰 시간 초과는 누구에게도 해를 끼치 지 않을 것입니다. 새 행을 사용할 수있게 되 자마자 "읽기"가 반환되기 때문입니다 ...

관련 정보