我运行了一堆功能。 他们每个人都输出大量的文本到stdout防止我从快速检查结果。 有没有简单的方法来阻止输出要到标准输出通道? 谢谢
Answer 1:
如果功能只是写到标准输出进行日志记录,你想抛出所有的东西走,他们都不想写入到磁盘或插座或任何其他类型的渠道,最简单的方法是这样的:
rename puts original_puts
proc puts args {} ;# A do-nothing procedure!
转换回正常运行:
rename puts {}
rename original_puts puts
请注意,这将导致问题如果包装代码中有一个错误,除非你很小心。 这里有一个包裹“小心”版本(Tcl的8.5):
proc replacement_puts args {}
proc silentEval {script} {
rename puts original_puts
interp alias {} puts {} replacement_puts
catch [list uplevel 1 $script] msg opts
rename puts {}
rename original_puts puts
return -options $opts $msg
}
然后,你只是这样做:
silentEval {
call-noisy-function-A
call-noisy-function-B
...
}
如果你已经有了要写入文件(或插座或......)代码,然后它通过一个更复杂的是可能replacement_puts
(可以经常使用original_puts
做肮脏的工作)。
如果这些功能编写从C级到标准输出,你更卡住。 你可以做close stdout;open /dev/null
直接文件描述符水槽,但你不能从很容易恢复。 (有一个dup
在TclX包,如果这是必要的。)如果你可以先尝试了上面的简单版本。
Answer 2:
防止输出到标准输出/标准错误的唯一的好办法是删除(在某种程度上)从正在执行的脚本解释器的标准输出/标准错误通道,因为有很多的方式来写东西到一个通道(包括但不限于puts
, chan puts
和fcopy
)
我建议创建一个新的安全插补和通道转移到该插补,调用脚本,并传送通道回来。 之后,你可以选择删除或插补重用它类似的目的。
proc silentEval {script} {
set i [interp create -safe]
interp transfer {} stdout $i
catch [list uplevel 1 $script] msg opts
interp transfer $i stdout {}
interp delete $i
dict incr $opts -level
return -options $opts $msg
}
文章来源: tcl stop all output going to stdout channel?