在 LSF 命令中返回管道命令的退出代码
Posted
技术标签:
【中文标题】在 LSF 命令中返回管道命令的退出代码【英文标题】:Returning exit code of piped command in a LSF command 【发布时间】:2015-01-22 22:32:12 【问题描述】:我希望我的问题不是太具体...
关于如何返回通过管道传送到另一个命令的命令的退出代码有很多问题和答案,但我的情况有点不同......
我有一个通用命令,我将输出传递到语法着色脚本。该命令通过 LSF 的 bsub 执行。像这样的:
bsub <switches> "command | colorize"
假设命令返回一个非零退出值。由于 colorize 命令,bsub 返回零退出值。
如果我不管它--
bsub <switches> "command"
退出值是命令中正确的非零值。
有没有办法用管道获取非零值?
为了全面披露,这个 bsub 实际上是通过 perl 中的 system() 调用来调用的。只要 bsub 返回非零值,系统调用就应该返回非零值,一切正常。
我查看了如何通过 $PIPESTATUS 从管道命令中获取退出代码,但我认为它在这种情况下不起作用,因为 1)我是从 perl 而不是 shell 运行的,并且 2)我没有知道 bsub 是否会返回。
【问题讨论】:
一些像 bash 这样的 shell 提供了一个像-o pipefail
这样的选项,这将导致管道链返回第一个非零返回码(如果有的话)。我不熟悉 bsub,但希望它提供类似的选项。如果没有,您可以像 bsub <switches> "bash -o pipefail -c 'command | colorize'"
一样调用 bash,但如果 command
需要任何字符转义,它就会变得混乱。
【参考方案1】:
根据 Llama 先生的评论:
像 bash 这样的一些 shell 提供像
-o pipefail
这样的选项,这将导致管道链返回第一个非零返回码(如果有的话)。
您可以像这样将管道放入脚本中:
#!/bin/bash
set -o pipefail
command | colorize
然后通过将脚本直接假脱机到bsub
来提交您的工作:
bsub <switches> < yourscript.sh
作为旁注,您还可以在脚本中定义<switches>
,如下所示:
#!/bin/bash
#BSUB -n 4
#BSUB -o outfile.txt
set -o pipefail
command | colorize
然后以这种方式将其转入bsub
:
bsub < yourscript.sh
【讨论】:
感谢您的建议。就我而言,我是动态创建命令的,因此将其放入脚本中会涉及编写文件等。比我想象的要麻烦得多。相反,我确实找到了一种解决方法——在我的 colorize 脚本中,我现在计算通过管道传送给它的错误消息的数量。如果 count > 0,则 colorize 脚本返回一个非零退出代码,LSF 返回给 perl。所以,我认为这是工作。再次感谢。以上是关于在 LSF 命令中返回管道命令的退出代码的主要内容,如果未能解决你的问题,请参考以下文章