TCL停止所有输出将标准输出通道?(tcl stop all output going to std

2019-09-19 01:18发布

我运行了一堆功能。 他们每个人都输出大量的文本到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:

防止输出到标准输出/标准错误的唯一的好办法是删除(在某种程度上)从正在执行的脚本解释器的标准输出/标准错误通道,因为有很多的方式来写东西到一个通道(包括但不限于putschan putsfcopy

我建议创建一个新的安全插补和通道转移到该插补,调用脚本,并传送通道回来。 之后,你可以选择删除或插补重用它类似的目的。

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?
标签: tcl stdout