【问题标题】:immediately catching that not all environment variables have been defined on qsub command line立即发现并非所有环境变量都已在 qsub 命令行上定义
【发布时间】:2014-04-28 16:01:30
【问题描述】:

我正在使用qsub 提交 pbs 作业。我的作业文件需要定义 5 个环境变量:qsub -v A=foo,B=bar,C=cat,D=dog,E=qux jobfile.sh。有时,我可能会忘记在命令行上定义其中一个变量,因为我稍后才提交以找出我的错误。

那么,有没有办法捕捉到使用qsub提交时没有定义所有环境变量的情况?还是我必须接受在提交包含许多必需环境变量的作业文件时必须非常小心?

谢谢,

保罗

【问题讨论】:

    标签: bash pbs


    【解决方案1】:

    您可以做的最好的事情是在jobfile.sh 的开头添加运行时检查,如果未设置任何预期的变量,它将导致它退出。

    set -u
    : $A $B $C $D $E
    set +u
    

    set -u 告诉外壳程序在尝试扩展未设置的参数时退出。 : 命令什么都不做,但它的参数确实首先经过标准扩展,所以如果五个中的任何一个未设置,shell 将退出。 set +u 然后禁用对 shell 其余部分的未设置参数检查。

    qsub 本身无法检查给定作业以确定它可能需要哪些变量。

    【讨论】:

      【解决方案2】:

      我真的很喜欢@chepner 的简洁回答,但如果你不想在set -/+u 之间切换,那么你可以以类似的方式使用这个shell parameter expansion

      : ${A?} ${B?} ${C?} ${D?} ${E?}
      

      如果没有设置任何变量,那么你会得到这样的错误并且脚本会立即退出:

      ./jobfile.sh: line 3: A: parameter null or not set
      

      或者,您可以像这样使用自己的错误消息覆盖默认错误消息:

      ${A?Your message here}
      

      来自manual

      ${parameter:?word}
      

      如果参数为 null 或未设置,则将 word 的扩展(或如果 word 不存在,则将产生一条消息)写入标准错误,并且 shell,如果它不是交互式的,则退出。否则,参数的值被替换。

      【讨论】:

      • +1 表示bash。我使用了set -/+ u,因为它适用于任何 POSIX shell。
      猜你喜欢
      • 2023-03-22
      • 2021-12-11
      • 2011-07-16
      • 1970-01-01
      • 2011-01-11
      • 2015-08-25
      • 1970-01-01
      • 2016-05-29
      • 2021-05-10
      相关资源
      最近更新 更多