将 tcl proc 的输出重定向到文件和输出(如 tee)

Redirecting output of tcl proc to file and output (like tee)

我需要 redirect 我在一次搜索中找到的:

redirect -tee LogFile.log {include ../RunDemoTests.tcl}

其中 include 是 TCL proc../RunDemoTests.tcl 是 proc 的参数。是否有我需要能够使用重定向的库,或者这不是通用的 tcl?

我在一个 EDA 工具环境中工作,该环境在 Windows 和 Linux 下运行,所以我需要一个仅 TCL 且不依赖于 OS 的解决方案].

我尝试了多种变体:

set ch [open |[list include "../OsvvmLibraries/UART/RunDemoTests.tcl"] r]
set lf [open build.log w]
puts "Starting"
puts $lf "Starting"
while {[gets $ch line]>=0} {
  puts $line
  puts $lf $line
}
close $lf

然而,这似乎只在命令来自 OS 环境时有效,例如:

set ch [open |[list cat ../tests.pro] r]

从这里打印可能有很多行,缓冲没问题,但不会收集整个文件然后打印,因为文件可能很长(180K 行)。

前一段时间在回答关于 comp.lang.tcl 的问题时,我创建了一个小的 Tcl 模块来提供 Tcl 中的 tee-like 功能。我现在已经在 Tcl wiki.

上发布了代码

你会这样使用它:

package require tee
tee stdout build.log
try {
    puts "Starting"
    include ../OsvvmLibraries/UART/RunDemoTests.tcl
} finally {
    # Make sure the tee filter is always popped from the filter stack
    chan pop stdout
}

这假定 include RunDemoTests.tcl 命令将输出输出到 stdout