2012-11-06 4 views
3

나는 지금 모든 곳에서 답을 찾기 위해 더 많은 시간을 보냈으며 지금까지 아무 것도 작동하지 않았습니다. 내가하려고하는 것은 GNU 화면 세션에 첨부하여 명령 행 인수 (명령)를 보내고 그 한 명령의 결과를 출력하는 expect 스크립트를 실행하는 것이다. 지금까지 내 scritps 중 하나입니다Tcl을 통한 명령 출력 예상


#!/usr/bin/expect -f 


set timeout 3 
#exp_internal 1 

spawn screen -raAd call_sess 
sleep 1 

expect -re "\\\$" { 
    send $argv 
    send "\n" 
    sleep 1 
} 

expect -re ".*" { 
    set output $expect_out(0,string) 
} 

expect "\$" { 
    send "\001" 
    send "d" 
} 

expect eof { 
    puts "OUTPUT---------------" 
    puts $output 
    puts "OUTPUT---------------" 
} 

와 $ expect_out (0, 문자열) 만하더라도, 줄 바꿈과 일치 * 마지막 경기 이후 모두 일치해야합니다.. 누구나 내가이 일을 끝내는 데 도움이된다면, 나는 포기하고 불가능하게 만들 준비가되어있다.

EDIT : 주석에 응답되었지만 명령이 화면에서 실행되도록 지정 했어야하며 올바르게 출력을 캡처 할 수 없습니다.

EDIT2 : 제안 된대로 스크립트를 화면에 표시하도록 변경했습니다. 감사합니다.

+0

$ argv를 보낸 후에 '\ r'을 보내면 안됩니까? –

+0

'\ n'은 명령을 보내는 데 사용됩니다. 3.6.5-1-ARCH가 실행되면 차이가 발생합니다. 명령이 실행되면 출력을 올바르게 캡처 할 수 없습니다. – apottere

+0

Expect에 대해 많이 알지는 못하지만 명령 출력을 임시 파일로 리디렉션 한 다음 해결할 수 있습니까? –

답변

2

대답의 쉬운 부분은 .*이 빈 문자열과 일치하므로 expect_out으로 갈 것입니다.

어려운 부분은 이전의 모든 명령을 포함하여 전체 화면을 제공하는 화면이므로 보낸 명령의 결과를 찾는 것이 조금 어려울 수 있습니다.

+0

하지만 욕심이 있으면 안 되니? 아니면'. *'만 빈 문자열과 일치한다는 말입니까? 그렇다면 그 이상은 어떻게 될까요? – apottere

+1

그 시점에서 버퍼에있는 모든 것에 대해서만 욕심이 일치합니다. 항상 일치 할 것이므로 생성 된 프로세스에서 더 이상 아무것도 읽지 않을 것으로 예상됩니다. 명령의 마지막에 오는 것이 무엇이든 (예 : 다음 프롬프트와 같은) 기대하기가 훨씬 더 신뢰할 수 있으므로 완료 시점을 알 수 있습니다. 그렇게하면 예상되는 프로세스에서 계속 읽기가 가능합니다. –

+0

또한 왜 단순히 화면을 생성하는 대신 셸을 생성 한 다음 화면을 실행합니까? –