2013-10-11 4 views
1

Windows에서 TCL 스크립트로 실행 된 명령 출력에 조직을 가져 오려고합니다. 상황은 결국 펄 스크립트를 호출하는 tcl 스크립트가 있다는 것입니다. 이런 식으로 뭔가 : 표준 출력과 표준 에러 모두STDOUT 및 STDERR에서 TCL 변수에 메시지 할당

펄 스크립트 출력 결과 :

#print message to STDOUT by default 
print "process A running ..."; 
... 
if ($fail) { 
    #print to STDERR 
    print STDERR "Process A failed."; 
} 

처음에, 나는 TCL 스크립트에서보고 싶어 모두 STDERR로 인쇄에서 메시지했지만, 지금은 원하는 둘 다. print에서 stdout으로가는 메시지를 하나의 tcl 변수에 저장하고 stderr로 보낸 메시지를 다른 tcl 변수에 저장하는 방법이 있습니까?

puts "Running perl script ..." 
catch {[set stdout_var [exec perl C:/myScript.pl >@stdout]]} err_msg 
puts "\n\nerrmsg:\n$err_msg" 
puts "\n\nstdout:\n$stdout_var" 

는 이렇게, 나는 (내가 거기 절반 방법이야)를 ERR_MSG 변수에 STDERR에 인쇄 된 메시지 만받을 그러나, stdout_var 변수 결코 : 이것은이 작동하지 갈 수있는 TCL 내 시도였다 아무것도 설정됩니다. 나는 그것이 STDOUT에 대한 메시지로 설정되기를 기대했지만, 그렇지 않았습니다. > @stdout을 제거하면 stdout_var이 여전히 할당되지 않고 err_msg에 STDERR 및 STDOUT에 인쇄 된 모든 메시지가 포함됩니다.

감사합니다.

+0

을있다. – potrzebie

답변

0

는 리디렉션 예를 임시 파일 중 하나 here on the Tcl wiki

puts "Running perl script ..." 

set pipe [open "| perl C:/myScript.pl"] 
set standard_output [read -nonewline $pipe] 
set exit_status 0 
if {[catch {close $pipe} standard_error] != 0} { 
    global errorCode 
    if {"CHILDSTATUS" == [lindex $errorCode 0]} { 
     set exit_status [lindex $errorCode 2] 
    } 
} 
puts "exit status: $exit_status" 
puts "\n\nstdout:\n$standard_output" 
puts "\n\nstderr:\n$standard_error" 
+0

조금 더 복잡해지기를 원했지만 시도해 봤습니다. $ standard_error에는 오류 메시지 만 들어 있습니다. 그러나 $ stnadard_output에는 stnadard 출력과 표준 오류 메시지가 모두 들어 있습니다. 나는 그들을 제거하기 위해 그 var를 더 처리 할 수 ​​있었다고 생각하지만 나는 그들이 처음에는 거기에 있었으면 좋겠다고 희망했다. – radensb

+0

나는 일할 것으로 예상했다. perl 스크립트가 두 채널 모두에 오류를 침범하라는 명령을받지 않았다면; 나는 그런 것들을 디버깅을 위해 넣었고, 그 이후에 (실제로는 내 자신의 코드 일 때) 왜 오래되었는지 궁금해했다. 아마도 당신은 똑같은 일을했을 것이다. –