如何从 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
调用的末尾添加 &
而不是 运行 在单独的线程中。在不知道自己在做什么的情况下无法确定,但值得考虑。
我创建了一个线程:
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
调用的末尾添加 &
而不是 运行 在单独的线程中。在不知道自己在做什么的情况下无法确定,但值得考虑。