2016-09-19 4 views
1
# Prints the string in a file 
puts $chan stderr "$timestamp - Running test: $test" 

# Prints the string on a console 
puts "$timestamp - Running test: $test" 

puts의 출력을 화면과 로그 파일에 동시에 보낼 수있는 방법이 있습니까? 현재 나는 이것을 달성하기 위해 위의 두 줄을 하나씩 차례대로 가지고 있습니다.tcl 스크립트에서 puts를 사용하여 콘솔과 파일에 동시에 문자열을 쓸 수 있습니까?

또는 tcl에 다른 해결책이 있습니까?

proc multiputs {args} { 
    if { [llength $args] == 0 } { 
     error "Usage: multiputs ?channel ...? string" 
    } elseif { [llength $args] == 1 } { 
     set channels stdout 
    } else { 
     set channels [lrange $args 0 end-1] 
    } 
    set str [lindex $args end] 
    foreach ch $channels { 
     puts $ch $str 
    } 
} 

예 :

답변

3

대신 puts의 다음 PROC 사용

# print on stdout only 
multiputs "1" 

# print on stderr only 
multiputs stderr "2" 

set brieflog [open brief.log w] 
set fulllog [open detailed.log w] 
# print on stdout and in the log files 
multiputs stdout $brieflog $fulllog "3" 
3

이 내가 광범위하게 사용했습니다 것이 아닙니다,하지만 작동하는 것 같다 (Tcl은 단지 8.6+) :

채널 변환 tcl::transform::observe 패키지가 필요합니다.

열기를 없음으로 로그 기록에 대한 파일 및 설정 버퍼링 :

set f [open log.txt w] 
chan configure $f -buffering none 

등록 stdout 수신기로 : 이제 로그 파일 모두로 이동합니다 채널 $c에 기록

set c [::tcl::transform::observe $f stdout {}] 

아무것도 및 stdout. 이 수신기로 로그 파일에 채널, stdout의 상단에 채널 변환을 더 이해하게 해주는 것 같다,하지만 난 그 일을 할 수 없었던 것을

puts $c foobar 

참고.

문서 : chan, open, package, puts, set, tcl::transform::observe (package)