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