我有以下情况:
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脚本的执行同步?
答案 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