1

我创建了一个线程:

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

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

4

1 回答 1

2

最简单的方法是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调用的末尾而不是在单独的线程中运行。如果不确切知道您在做什么,就无法确定,但值得考虑。

于 2022-03-01T16:13:22.083 回答