我正在尝试启动一个已编译的代码来处理我编写的TCL脚本所需的大量计算。启动代码时,我正在使用:
if {[catch {exec $cwd/TaubinSmoother &} error_out]} {
if {[string first "couldn" $error_out] != -1} {
puts "TaubinSmoother software could not be located."
exit
} else {
puts "$error_out"
}
}
执行exec
命令时,似乎没有错误,但是确实生成了一个错误,因为没有为 TaubinSmoother 运行所需的共享库正确设置PATH环境。 。我尝试使用:
proc launch {} {
set error_catch [catch {exec $cwd/TaubinSmoother &} error_out detail]
return $detail
}
set cwd [file dirname [info script]]
set error_out launch
puts "$error_out"
这也没有用,因为我只收到打印到标准输出的“启动”消息。我阅读了TCL, get full error message in catch command和有关catch和return的更多信息,但是在我的情况下,回答的问题不起作用,手册页上的示例也无济于事。如何获得实际错误以返回到正在运行的脚本,以便可以向未来的用户警告遇到的问题?
答案 0 :(得分:2)
您的第二次尝试在“达不到您的期望”的意义上失败了,因为该行
set error_out launch
应阅读
set error_out [launch]
背景:原始形式是将文字字符串“启动”分配给变量error_out
。因此,这就是您看到的打印内容。
您的exec
在后台模式(&
)下运行。因此,您的Tcl脚本不再与后台进程相关联。 exec
会返回而不会发出任何(背景错误)错误。最好使用open
和fileevent
使用经过子弹验证的Tcl惯用法来检查后台进程: