在 tcl 脚本中,我如何使用 puts 将字符串同时写入控制台和文件?
In a tcl script how can i use puts to write a string to the console and to a file at the same time?
# 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
:
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"
这不是我广泛使用的东西,但它似乎有效(仅限 Tcl 8.6+):
您需要频道转换 tcl::transform::observe
包:
package require tcl::transform::observe
打开一个日志文件进行写入并将缓冲设置为none:
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
之上进行通道转换似乎更有意义,并将日志文件的通道作为接收方,但我无法做到这一点。
文档:
chan,
open,
package,
puts,
set,
tcl::transform::observe (package)
# 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
:
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"
这不是我广泛使用的东西,但它似乎有效(仅限 Tcl 8.6+):
您需要频道转换 tcl::transform::observe
包:
package require tcl::transform::observe
打开一个日志文件进行写入并将缓冲设置为none:
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
之上进行通道转换似乎更有意义,并将日志文件的通道作为接收方,但我无法做到这一点。
文档: chan, open, package, puts, set, tcl::transform::observe (package)