Tcl 将标准输出重定向到文件不产生任何输出

Tcl redirect stdout to file produces no output

问题是 link 中回答内容的扩展。在尝试使用它来延迟打印输出时,shell 上的 cat file_name 在使用 after 的延迟时间内不会显示文件的内容。这是代码:

proc foo {times} { 
    while {$times >0} {
        puts "hello$times"
        incr times -1
        after 20000
        puts "hello world" 
    }
}
proc reopenStdout {file} {
    close stdout
    open $file w        ;# The standard channels are special
}

reopenStdout ./bar
foo 10

您正在写入的数据正在内存中缓冲,您写入的数据不足以将内部缓冲区刷新到磁盘。在 foo 的循环内添加一个 flush stdout,或者做一些类似设置新打开的通道为行缓冲的事情:

proc reopenStdout {file} {
    close stdout
    set ch [open $file w]        ;# The standard channels are special
    chan configure $ch -buffering line
}

如果行缓冲不够,您可以使用 chan configure-buffering and -buffersize 选项来获得最适合您需求的行为。