2012-08-17 4 views
2

모뎀에 일부 AT 명령을 보내려고했는데 변수에 응답을 캡처하려고합니다.bash -`read`는 리다이렉트에서 읽을 수 없습니다,`cat`은 잘 동작합니까?

exec 3<>/dev/ttyUSB3 

echo -e "AT+CGSN\n" >&3 

cat <&3 
#read -r RESPONSE <&3 
#echo "Response was $RESPONSE" 

exec 3<&- 
exec 3>&- 

결과 :

$ ./imei_checker.sh 
AT+CGSN 


356538041935676 



OK 

AT+CGSN 


356538041935676 



OK 

하지만 readcat를 변경하는 경우, 그것은 작동하지 않습니다

$ ./imei_checker.sh 
Response was AT+CGSN 

이 더 많은 질문 :

    여기 내 코드는
  1. 왜 dupplicate 출력을 표시합니까?
  2. 파일 핸들을 올바르게 닫으려면 어떻게해야합니까? exec 3<&-exec 3>&- 보이는 작동하지 않습니다. 나는 눌러야 만한다 Ctrl + C to 터미널을 다시 제어 할 수있다.
+0

허용되는 연습은 원래 질문과 관련된 정보로 _update_ 질문하는 것입니다. 그것이 다른 _ 문제라면, 그것은 새로운 질문이어야합니다. 업데이트 롤백. – paxdiablo

답변

2

readcat과 달리 기본적으로 읽고 파일 끝까지 에코합니다.

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>&- 

:로 기본적으로 사용자의 환경에 번역 할


지금) 정확한 것이 아니라면, 닫기을 사용해야합니다.

1

read은 설명자가 -u 다음의 인수로 읽습니다. 자세한 내용은 help read을 참조하십시오.

+0

'read -r -u3 RESPONSE'는 같은 결과를줍니다 (* 응답은 AT + CGSN *입니다). – quanta

+0

잠깐, 몇 번이나'읽기 '를 실행하고 있습니까? –

+0

하나만. 미안해, 그게 무슨 뜻이야? – quanta

1

당신이 변수로 개별 라인을 얻고 싶은 경우에 나는 whileread을 래핑하는 게 좋을 것 :

while read -r RESPONSE <&3; do 
    echo "Response was $RESPONSE" 
    ## e.g.: 
    [ "$RESPONSE" = "OK" ] && break 
done 

을 그러나 $RESPONSE에 거주하는 당신에게 다시 전송됩니다 "모든"원하는 경우 다음과 같이 할 수 있습니다.

RESPONSE="$(cat <&3)" 
+1

모뎀이 당신에게'OK' 줄을 보내지 않기로 결정한 경우에 대비해서, 여전히 타임 아웃을 넣는 것이 좋습니다. 또한, 내 대답에서 지적한 이유 때문에 파일 핸들이 모뎀에 의해 닫히지 않았기 때문에 마지막 것 ('cat')은 아마도 간단히 작동하지 않을 것입니다. 즉, 모뎀이 끝나기를 영원히 기다릴 것이기 때문에 매달리는 것 같습니다. '읽기 '해결책이 맞습니다. – paxdiablo

+0

@bitmask : 위의 코드를 사용하면 여전히 응답이 엉망입니다. 각 실행 후 다른 결과를 보여줍니다. – quanta