Tcl重定向标准输出到文件后,使用after延迟时Shell执行cat命令无法实时查看文件内容的问题
嘿,我来帮你搞定这个问题!你的代码里有两个核心问题,导致在after延迟期间用cat看不到bar文件的内容——咱们一步步拆解:
问题1:标准输出重定向没做好
你的reopenStdout过程里,关闭stdout后确实打开了文件,但没把这个文件句柄绑定到stdout变量上。Tcl里的stdout是个全局变量,指向当前的标准输出通道,你光打开文件不把它赋值给stdout,后续的puts根本没地方写!
正确的重定向写法应该是这样:
proc reopenStdout {file} { close stdout global stdout # 把新打开的文件句柄赋值给全局stdout,这样puts就会写到这里 set stdout [open $file w] }
问题2:文件缓冲区没及时刷新
就算重定向对了,Tcl默认对文件输出是全缓冲的——意思是内容会先存在内存里,要么等缓冲区满了,要么等文件关闭了才会写到磁盘。你用after卡了20秒,这时候内容还在内存里躺着,cat当然看不到。
解决办法也简单:每次puts之后手动调用flush stdout,强制把缓冲区的内容同步到磁盘:
proc foo {times} { while {$times >0} { puts "hello$times" flush stdout ;# 立刻把内容写到磁盘 incr times -1 after 20000 puts "hello world" flush stdout ;# 这行也要刷新 } # 循环结束别忘了关闭文件,确保所有剩余内容都写入 close stdout }
完整修复后的代码
把两个修正结合起来,完整代码如下:
proc reopenStdout {file} { close stdout global stdout set stdout [open $file w] } proc foo {times} { while {$times >0} { puts "hello$times" flush stdout incr times -1 after 20000 puts "hello world" flush stdout } close stdout } reopenStdout ./bar foo 10
现在你再运行这段代码,在after延迟的20秒里用cat ./bar,就能看到已经输出的内容啦!
内容的提问来源于stack exchange,提问作者almostacoder
相关产品推荐
相关产品推荐

