实时TCL exec输出

实时TCL exec输出,tcl,try-catch,exec,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,与执行大脚本同步?似乎通过将@stdout

我有以下情况:

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,与执行大脚本同步?

似乎通过将
@stdout
添加到exec参数列表中,我的问题得到了解决:

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

calling a BIG script
OK

似乎通过将
>@stdout
添加到exec param列表,我的问题得到了解决:

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上):

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

如果你真的需要它:

exec echo calling a BIG script >@stdout
# Everything wrapped around the exec is the same; I omit it for brevity
然后脚本的输出将直接写入标准输出。但是,您将无法从Tcl脚本中读取它。要从脚本中读取它,您可以尝试(在Unix上):


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

你好,多纳尔,我理解你提出的选择。最适合我的需要的是将输出重定向到stdout,而不在TCL变量中捕获它。我仍然需要的是从exec得到的退出代码。但这与我们的讨论无关,我们的讨论严格地说是关于子进程生成的标准输出流。谢谢你的回答。嗨,多纳尔,我理解你提出的选择。最适合我的需要的是将输出重定向到stdout,而不在TCL变量中捕获它。我仍然需要的是从exec得到的退出代码。但这与我们的讨论无关,我们的讨论严格地说是关于子进程生成的标准输出流。谢谢你的回答。