实时 TCL 执行输出

real-time TCL exec output

我有以下场景:

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 脚本的执行同步?

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

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

显示:

calling a BIG script
OK

如果你这样做:

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,这要复杂得多,或者可能创建一个管道并异步处理它。与您一直在做的事情相比,这在技巧上有了实质性的进步,这是因为您开始与程序的自然工作方式作斗争。坦率地说,如果你真的不需要它,你最好避免这种事情。