如何抑制TCL线程的错误/输出



我创建了一个线程:

set t1 [thread::create]
thread::send $t1 {
proc myProc {command args} {
exec {*}[auto_execok $command] {*}$args >& /dev/null
}
}

然后尝试发送异步命令:

thread::send -async $t1 [list myProc <command args>]

但是命令的错误/输出会显示在输出中。如何从发送到异步线程的命令中隐藏错误/输出?

最简单的方法是catch错误。

thread::send $t1 {
proc myProc {command args} {
catch {
exec {*}[auto_execok $command] {*}$args >& /dev/null
}
}
}

请注意,这会使的任何问题都更加难以调试!如果你能识别出你期望的错误,并用try来捕捉它们,那就更好了,所以意外错误仍然是你看到并必须处理的事情。

thread::send $t1 {
proc myProc {command args} {
try {
exec {*}[auto_execok $command] {*}$args >& /dev/null
} trap CHILDSTATUS {} {
# Ignore a non-zero exit?
}
}
}

对于这种特定的情况(从Tcl的角度来看,它在很大程度上是I/O绑定的(,您最好只将&添加到exec调用的末尾,而不在单独的线程中运行。在不知道自己在做什么的情况下,我真的不能确定,但这值得考虑。

最新更新