아래에 작은 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
변수와 함께 사용하면 해당 내용을 잃기 때문에 사용됩니다 .read
read
$ 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, 더 큰 시간 초과는 누구에게도 해를 끼치 지 않을 것입니다. 새 행을 사용할 수있게 되 자마자 "읽기"가 반환되기 때문입니다 ...