问题描述
当我运行包含以下几行的 Tcl 脚本时:
set V [exec bjobs ]
puts "bjobs= ${V}"
当作业存在时,它可以正常工作,但没有作业正在运行,它显示如下错误:
No unfinished job found
while executing
"exec bjobs "
invoked from within
"set V [exec bjobs ]"
解决方法
在我看来,bjobs
程序在这种情况下具有非零退出代码。 exec
手册页在小节 WORKING WITH NON-ZERO RESULTS
中包含此示例:
要执行可以返回非零结果的程序,您应该包装 在 catch 中调用 exec 并检查 -errorcode 的内容 如果有错误,则返回选项:
set status 0
if {[catch {exec grep foo bar.txt} results options]} {
set details [dict get $options -errorcode]
if {[lindex $details 0] eq "CHILDSTATUS"} {
set status [lindex $details 2]
} else {
# Some other error; regenerate it to let caller handle
return -options $options -level 0 $results
}
}
使用 try 命令更容易编写,因为这样可以 更容易捕获特定类型的错误。这是使用代码完成的 这个:
try {
set results [exec grep foo bar.txt]
set status 0
} trap CHILDSTATUS {results options} {
set status [lindex [dict get $options -errorcode] 2]
}
我想你可以这样写:
try {
set V [exec bjobs ]
} trap CHILDSTATUS {message} {
# Not sure how you want to handle the case where there's nothing...
set V $message
}
puts "bjobs= ${V}"
,
if {[catch {exec bjobs} result]} {
puts "bjobs have some issues. Reason : $result"
} else {
puts "bjobs executed successfully. Result : $result"
}
参考: catch
,在 exec
man
page 中仔细注意:
如果管道中的任何命令异常退出或被杀死或
暂停,然后 exec
将返回错误 [...]
如果任何命令
写入其标准错误文件并且该标准错误不是
重定向和-ignorestderr
未指定,则 exec
将返回一个
错误。
因此,如果 bjobs
在没有作业时返回非零值或打印到 stderr,则 exec 需要按照 Donal 的写入进行捕获或尝试。