read
은 cat
과 달리 기본적으로 읽고 파일 끝까지 에코합니다.
read
버전의 경우 OK
에 도달 할 때까지 (그리고 많은 숫자가 포함 된 행을 저장할 때까지) 시간 초과로 읽는 것이 가장 좋습니다.
나는 당신이 일을 중지하는 것 숫자 3 파일 핸들의 폐쇄 아니라고 찾을 생각 - 그것은 파일 끝 이벤트까지/에코을 읽을 수을 계속합니다 cat
될 가능성이 있다고 일어나지 않습니다. 그냥 넣으면
이 확신 할 수 있습니다
echo XYZZY
즉시 폐쇄 전에 exec
문. 여전히 cat
에있는 경우에는 절대로 볼 수 없습니다.
따라서 루프 번호 read
버전을 사용하면 문제가 해결 될 것입니다.
예로서
, 여기 당신이 표준 입력이 작업을 수행 할 read
를 사용하는 방법은 다음과 같습니다
#!/bin/bash
NUM=
while true ; do
read -p "> " -t 10 -r RESP <&0
if [[ $? -ge 128 ]] ; then RESP=OK ; fi
echo "Entered: $RESP"
if [[ $RESP = OK ]] ; then break ; fi
if [[ $RESP =~ ^[0-9] ]] ; then NUM=$RESP ; fi
done
echo "Finished, numerics were: '$NUM'"
그것은 더 이상 입력이 존재하지 않는 경우는 감지 read
의 타임 아웃 기능을 사용 (입력 설정 ~ OK
으로 강제로 루프를 종료합니다. 이 일 경우 이전에 OK
이 나오면 정상적으로 종료됩니다. 시간 초과는 모뎀이 예상대로 응답하지 않을 가능성을 대비하기 만합니다.
숫자는 처음에는 숫자로 시작하는 "모뎀"의 모든 줄에 겹쳐 쓰여집니다.
두 샘플로하고 "모뎀"에서 OK
응답하지 않고, 실행 :
pax> ./testprog.sh
> hello
Entered: hello
> 12345
Entered: 12345
> OK
Entered: OK
Finished, numerics were: '12345'
pax> ./testprog.sh
> hello
Entered: hello
> now we wait 10 secs
Entered: now we wait 10 secs
> Entered: OK
Finished, numerics were: ''
당신이 중 하나를 read <&3
또는 read -u3
것 (장치를 모뎀과 비슷한에 그 변환 너무 어렵지 않을 것 잘 작동). 내가 내가 가지고 있지 않기 때문에 모뎀이 (아주 잠시 동안 광대역에 있었다 엮은 것을을 테스트하지 않았습니다 이제
exec 3<>/dev/ttyUSB3
echo -e "AT+CGSN\n" >&3
NUM=
while true ; do
read -t 10 -r RESP <&3
if [[ $? -ge 128 ]] ; then RESP=OK ; fi
echo "Entered: $RESP"
if [[ $RESP = OK ]] ; then break ; fi
if [[ $RESP =~ ^[0-9] ]] ; then NUM=$RESP ; fi
done
echo "Finished, numerics were: '$NUM'"
exec 3<&-
exec 3>&-
:로 기본적으로 사용자의 환경에 번역 할
지금) 정확한 것이 아니라면,
닫기을 사용해야합니다.
허용되는 연습은 원래 질문과 관련된 정보로 _update_ 질문하는 것입니다. 그것이 다른 _ 문제라면, 그것은 새로운 질문이어야합니다. 업데이트 롤백. – paxdiablo