实时TCL exec输出

时间:2015-06-04 14:21:07

标签: tcl try-catch exec

我有以下情况:

if { [catch { exec echo calling a BIG script } exec_msg] } {
    puts "NOK"
    puts "output of the BIG script: $exec_msg"
} else {
    puts "OK"
    puts "output of the BIG script: $exec_msg"
}

是否有任何解决方案可以实时打印$ exec_msg,与BIG脚本的执行同步?

2 个答案:

答案 0 :(得分:4)

如果你这样做:

exec echo calling a BIG script >@stdout
# Everything wrapped around the exec is the same; I omit it for brevity

然后脚本的输出将直接写入标准输出。 然而,您将失去从Tcl脚本中读取它的能力。要从脚本中读取它,您可以尝试(在Unix上):

exec echo calling a BIG script | tee /dev/tty

然而,这会延迟输出,直到它一次累积几千字节(大多数程序输出到非终端的功能)。修复需要使用Expect,这要复杂得多,或者可能创建一个管道并异步处理它。从你一直在做的事情来看,这都是一个很大的进步,这是因为你开始反对程序如何自然地运作。坦率地说,如果你真的不需要它,你最好避免那种事情。

答案 1 :(得分:2)

似乎通过将>@ stdout附加到exec参数列表,我的问题就解决了:

if { [catch { exec echo calling a BIG script >@ stdout }] } {
    puts "NOK"
} else {
    puts "OK"
}

显示:

calling a BIG script
OK