2013-07-09 6 views
1

전원을 켜고 올바르게 시작될 때까지 기다리는 데 필요한 외부 장치가 있습니다. 이 작업을 수행하려는 방식은 직렬 포트를 통해 PuTTY에 대한 명령 줄 도구 인 Plink를 통해 연결하고 인쇄 한 모든 텍스트 줄을 읽고 시작되었음을 나타내는 텍스트 문자열을 찾으려고합니다. 정확히. 해당 텍스트 문자열을 찾으면 스크립트가 진행됩니다.실시간으로 stdout에서 내용을 읽으십시오.

문제는이 텍스트 줄을 실시간으로 읽어야한다는 것입니다. 지금까지 명령을 호출 한 다음 명령이 완료되면 출력을 처리하는 메서드 만 보았습니다. 또는 명령에 &을 추가하고 출력을 파일로 리디렉션하여 Plink가 백그라운드에서 실행되도록 할 수 있습니다. 그러나 문제는이 파일이 처음부터 비어 있으므로 스크립트가 바로 진행된다는 것입니다. 특정 파일의 새로운 줄을 기다린 다음에 그것을 읽는 방법이 있습니까? 아니면 다른 사람이 이것을 달성하는 방법을 알고 있습니까?

./plink "connection_name" > new_file & 

sleep 10 # Because I know that it will take a little while before the correct text string pops up but I don't know the exact time it will take... 

while read -r line 
do 
    # If $line is the correct string, proceed 
done < new_file 

그러나, 내가 올바른 텍스트 문자열이 발견 될 때 스크립트가 직접 진행하려면 : 여기

는 지금까지 발견 한 가장 좋은 솔루션입니다.

즉, 명령이 실행되기 전에 명령 출력에 계속 액세스 할 수있는 방법이 있습니까?

+1

'./plink "connection_name"을 (를) 사용해 보셨습니까? 읽는 동안 -r 행; somestuff을해라. 다 됐어? – user000001

+0

sleep에서 새로운 스크립트를 작성하여'readln' 그리고'./plink "connection_name"> new_file |으로 끝내십시오. ./ readln' – mirkobrankovic

+0

LOL 동시에 – mirkobrankovic

답변

5

이 당신을 위해 무엇을 찾고있는 사람이 될 수 있습니다

while read -r line; do 
    # do your stuff here with $line 
done < <(./plink "connection_name") 

그리고 당신은 sleep 10해야하는 경우 :

{ 
    sleep 10 
    while read -r line; do 
     # do your stuff here with $line 
    done 
} < <(./plink "connection_name") 

다음에 비해이 솔루션의 장점 :

./plink "connection_name" | while read -r line; do 
    # do stuff here with $line 
done 

(누군가가 곧 제안 할 것이라고 확신합니다)은 while loo입니다. p는 서브 쉘에서 실행되지 않습니다.

구조체 <(...)Process Substitution입니다.

희망이 도움이됩니다.

+0

고마워! 완벽하게 작동합니다! 나는 당신이 다른 사람이 곧 제안 할 것이라고 생각했던 해결책을 시도했지만, 그것을 테스트 할 때 실수를 범했음을 깨달았습니다. 그래서 그것이 전에 나쁜 해결책이라고 생각한 것입니다. –

1

일반 파일을 사용하는 대신 명명 된 파이프를 사용하십시오. new_file에서 읽을 수있는 무언가가있을 때까지

mkfifo new_file 

./plink "connection_name" > new_file & 

while read -r line 
do 
    # If $line is the correct string, proceed 
done < new_file 

while 루프가 차단되므로 잠을 할 필요가 없다.

(이 프로세스 대체가 무대 뒤에서 무엇을 기본적이지만, 특별한 쉘 지원을 필요로하지 않습니다. POSIX 쉘은 공정 대체를 지원하지 않음) 또한 bash (4.2 이상) 지원

최신 버전 현재의 쉘에서 파이프 라인의 최종 명령을 실행하여 간단한 솔루션을 만드는 옵션.

shopt +s lastpipe 
./plink "connection_name" | while read -r line; do 
    # ... 
done 

가능.

관련 문제