如何从 TCL 线程中抑制 errors/outputs?

How to suppress errors/outputs from a TCL thread?

我创建了一个线程:

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>]

但是命令中的 error/output 正在输出中显示。 如何从发送到异步线程的命令中隐藏 errors/outputs?

最简单的方法是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-bound )你最好只在 exec 调用的末尾添加 & 而不是 运行 在单独的线程中。在不知道自己在做什么的情况下无法确定,但值得考虑。