【问题标题】:How to run bash script while it returns code 0?如何在返回代码0时运行bash脚本?
【发布时间】:2017-04-05 15:39:27
【问题描述】:

我有包含多行代码的 bash 脚本,我需要在它返回 $ 时运行它? == 0,但如果它有错误,我需要停止它并使用代码 1 退出?

问题是怎么做?

我尝试使用set -e 命令,但 Jenkins 没有将构建标记为失败,对他来说它看起来像成功

我还需要获取错误消息以在我的 Jenkins 日志中显示它

我设法获得了错误代码(在我的情况下它将是 126),但是如何获得错误消息?

main file 
fileWithError.sh
rc=$?; if [[ $rc != 0 ]]; then 

echo "exit {$rc} ";
fi

fileWithError.sh
#!/bin/sh
set -e
echo "Test"
agjfsjgfshgd
echo "Test2"
echo "Test3"

【问题讨论】:

  • 您的问题不清楚。它是“长”的,因为脚本本身是很多行代码,还是运行了“长”的时间?如果任何命令失败,您是否希望它以非零状态终止,或者您是否希望在连续循环中运行它,仅在脚本调用失败时中止? “它有错误”是什么意思?你的意思是它遇到了意外的输入吗?或者它调用的命令之一以非零状态退出?或者它产生超出预期范围的输出?澄清问题。
  • 我更新了问题
  • 你还没有回答许多澄清问题。 set -e 确实应该因错误而失败,所以听起来调用你的脚本的代码是错误的。
  • 我可能是错的,但看起来你是从另一个脚本调用一个脚本。 Jenkins 只看到您成功调用了辅助脚本,从技术上讲,它的退出代码为零。

标签: linux bash ubuntu jenkins


【解决方案1】:

只需在文件开头添加命令set -e

这应该和这个类似

#!/bin/sh

set -e

#...Your code...

【讨论】:

  • 我尝试过同样的方法,但使用 #!/bin/bash,它会停止我的脚本,但对于 Jenkins 构建看起来像 Success
  • 也许尝试将其包装在一个脚本中,如果实际脚本失败,Jenkins 会将其视为错误#!/bin/sh bash actual-script.sh e=$? if [ $e -ne 0 ]; then echo "FAILED with error code $e" #do sth that looks like an error to jenkins #.... #exit with error exit 2 fi
  • 你能看看 goo.gl/WrgV4f 这里我有一个小项目要展示
【解决方案2】:

我想你只是想要:

 #!/bin/sh 
 while fileWithError.sh; do
     sleep 1; 
 done
 echo fileWithError.sh failed!! >&2

注意,如果脚本写得好,那么回显是 多余的,因为 fileWithError.sh 应该写一个像样的 错误信息已经。此外,睡眠可能不需要,但如果脚本快速成功,则有助于防止快速循环。

你可以得到显式的返回值,但它需要一些重构。

#!/bin/sh
true
while test $? = 0; do fileWithError.sh; done
echo fileWithError.sh failed with status $?!! >&2

因为 while 脚本的返回值将是 第一次构造时 sleep 的返回值。

【讨论】:

    【解决方案3】:

    仅获得错误代码并不容易。 这个怎么样...

    #!/bin/bash
    Msg=$(fileWithError.sh 2>&1) # redirect all error messages to stdout
    if [ "$?" -ne 0 ] # Not Equal
    then 
        echo "$Msg"
        exit 1
    fi
    exit 0
    

    您捕获了fileWithError.sh 创建的所有消息,如果程序返回错误代码,那么您已经将错误消息保存在变量中。

    但这会造成不利影响,因为您将临时存储由fileWithError.sh 创建的所有消息,直到出现错误。

    您可以使用echo "$Msg" |tail -n 1 过滤错误消息,但不是 100% 保存。

    您还应该在fileWithError.sh中进行一些更改...
    set -etrap "exit 1" ERR 切换。这将在出错时关闭脚本。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多