2016-09-19 15 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の出力を画面とログファイルに同時に送信する方法はありますか?現在、私はこれを達成するためにスクリプトの中で上記の2つの行を次々に持っています。tclスクリプトでは、putsを使ってコンソールとファイルに同時に文字列を書き込むことはできますか?

また、tclに他の解決策がありますか?

答えて

3

代わりputs次のPROCを使用します。

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

例:

# 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

オープンnoneに書き込みや設定バッファリングのためのログファイルチャネル$cに書き込ま

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

ものは、今、ログファイルの両方に行きますおよびstdout。受信機のように、ログ・ファイルへのチャネルで、stdoutの上にチャネル変換を持っているより多くの意味をなすように見えるだろうが、私はその仕事をすることができていないことを

puts $c foobar 

注意。

ドキュメント: chanopenpackageputssettcl::transform::observe (package)

関連する問題