【问题标题】:Filter output and obtain exit code at the same time of an program in Linux shellLinux shell中程序的过滤输出并同时获取退出代码
【发布时间】:2014-02-02 07:32:11
【问题描述】:

我通过执行一系列 shell 命令在 Jenkins(Jenkins 是一个开源的持续集成工具)中运行工作。其中一个命令是运行一个 Java 程序来进行一些数据验证。如果遇到无效日期,Java 程序将以非零退出代码退出,以便 Jenkins 可以发现这次构建失败。

不幸的是,Java 程序向 stdout 和 stderr 打印了太多日志,只有少数有用。由于无法修改 Java 程序,我决定使用 grep 过滤输出。所以我把shell写成:

java -cp $CLASSPATH MetaValidatorMain | grep -v "useless keyword1"| grep -v "useless keyword2"

但问题是,在执行完这行shell后,父进程(Jenkins)得到了grep的退出代码,而java却死了,所以Jenkins无法确定构建是否成功。

我也试过这个:

(java -cp $CLASSPATH MetaValidatorMain || exit 1) | grep -v "useless keyword1"| grep -v "useless keyword2"

也没有用。

谁能告诉我如何编写shell行来过滤输出并同时获得正确的退出代码。

谢谢

【问题讨论】:

    标签: java linux bash shell jenkins


    【解决方案1】:

    有点长的路要走,但是您可以将程序输出重定向到一个文件,捕获返回,然后 grep 输出文件以获得您想要的内容:

    java -cp $CLASSPATH MetaValidatorMain > /tmp/outfile.txt 2>&1
    RETURN_CODE=$?
    grep -v "useless keyword1" /tmp/outfile | grep -v "useless keyword2"
    exit RETURN_CODE
    

    【讨论】:

    • 确实有点长的路要走,但如果可行,而且代码很清晰。谢谢
    【解决方案2】:

    有 3 种方法可以做到这一点。但是,您当前的设置应该可以工作。这里的原因是,如果命令失败,grep 将不匹配任何内容,因此 grep 将返回状态为1(除非程序无论如何总是显示该文本)。

    管道故障

    第一种方法是设置pipefail 选项。这是最简单的,它的作用基本上是将退出状态$?设置为最后一个程序的退出代码以非零退出(如果全部成功退出则为零)。

    # false | true; echo $?
    0
    # set -o pipefail
    # false | true; echo $?
    1
    

    $PIPESTATUS

    Bash 还有一个名为$PIPESTATUS 的变量,它包含了最后一条命令中所有程序的退出状态。

    # true | true; echo "${PIPESTATUS[@]}"
    0 0
    # false | true; echo "${PIPESTATUS[@]}"
    1 0
    # false | true; echo "${PIPESTATUS[0]}"
    1
    # true | false; echo "${PIPESTATUS[@]}"
    0 1
    

    您可以使用第 3 个命令示例来获取您需要的管道中的特定值。

    但此解决方案可能不可用。我认为$PIPESTATUS 可能已添加到相当新的 bash 版本中,而您的操作系统可能没有它。

    单独执行

    这是最笨拙的解决方案。分别运行每个命令并捕获状态

    # java -cp $CLASSPATH MetaValidatorMain > /tmp/outfile.txt 2>&1
    # RETURN_CODE=$?
    # grep -v "useless keyword1" /tmp/outfile | grep -v "useless keyword2"
    # exit RETURN_CODE
    

    【讨论】:

      猜你喜欢
      • 2015-11-21
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2011-06-21
      相关资源
      最近更新 更多