如何在没有作业运行时修复具有命令 [exec bjob​​s] 的 tcl 脚本中的错误消息?

问题描述

当我运行包含以下几行的 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 的写入进行捕获或尝试。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...