在tcl脚本中,如何使用puts将字符串同时写入控制台和文件?

时间:2016-09-19 18:34:57

标签: tcl tclsh

# Prints the string in a file
puts $chan stderr "$timestamp - Running test: $test"

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

有没有办法可以将put的输出同时发送到屏幕和日志文件?目前,我在脚本中依次使用上述两行来实现此目的。

或者在tcl中还有其他解决方案吗?

2 个答案:

答案 0 :(得分:3)

使用以下proc而不是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"

答案 1 :(得分:3)

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

您需要频道转换#inner_body { position: relative; margin: auto; text-align: center; width: 50%; height: auto; border: 1px solid #000; } button { position: absolute; bottom: 0; padding: 20px; background-color: #718bf3; } button:nth-child(1) { left: 40px; } button:nth-child(2) { left: 170px; } button:nth-child(3) { left: 300px; } 包:

$(document).on('click', 'button', function() {
    $(this).animate({
        left: 0,
        top: 0,
    }, "slow").css('bottom', 'auto');
    $(this).siblings().delay(1200).fadeOut(300);
});

打开日志文件进行写入并将缓冲设置为无:

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之上进行频道转换似乎更有意义,将日志文件的频道作为接收器,但我无法做到这一点。

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