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 中还有其他解决方案吗?

4

2 回答 2

3

使用以下过程代替puts

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"
于 2016-09-19T19:05:25.610 回答
3

这不是我广泛使用的东西,但它似乎有效(仅限 Tcl 8.6+):

您需要通道转换tcl::transform::observe包:

package require tcl::transform::observe

打开一个用于写入的日志文件并将缓冲设置为无:

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

注册stdout为接收者:

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

写入通道的任何内容$c现在都将进入日志文件和stdout.

puts $c foobar

请注意,将通道转换置于 之上似乎更有意义,stdout将日志文件的通道作为接收器,但我无法做到这一点。

文档: chanopenpackageputssettcl::transform::observe (包)

于 2016-09-20T06:18:07.627 回答