# 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中还有其他解决方案吗?
答案 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
之上进行频道转换似乎更有意义,将日志文件的频道作为接收器,但我无法做到这一点。
文档: chan, open, package, puts, set, tcl::transform::observe (package)