gpt4 book ai didi

linux - 当 while/if/etc 出现错误时如何使 bash 脚本失败?

转载 作者:太空狗 更新时间:2023-10-29 12:22:25 30 4
gpt4 key购买 nike

我使用 Groovy 运行 Jenkins 管道作业。 Groovy 为每个步骤调用 bash 脚本。

我想在出现错误时让整个工作失败。

对于 Groovy,我使用 returnStatus: true

对于 Bash,我使用 set -e

但是带有 set -e 的 bash 脚本不会退出,例如,如果 while 语句有错误。根据“set”的 Linux 手册页,这是实际应该发生的情况。我想知道在那种情况下如何立即退出。

脚本:

[jenkins-user@jenkins ~]$ cat script.sh
#!/bin/bash

set -xe

FILE=commands.txt

echo "echos before while"

# Run the commands in the commands file
while read COMMAND
do
$COMMAND
done < $FILE
echo $?

echo "echos after faulty while"

假设“commands.txt”不存在。运行脚本:

[jenkins-user@jenkins ~]$ sh script.sh
echos before while
script.sh: line 13: commands.txt: No such file or directory
1
echos after faulty while
[jenkins-user@jenkins ~]$ echo $?
0

虽然 while 语句返回退出代码 1,但脚本继续并成功结束,正如随后使用 echo $? 检查的那样。

这就是我强制 Groovy 失败的方式,在使用 bash/python/etc 命令/脚本执行步骤后返回非零退出代码:

pipeline {
agent any
stages {
stage("A") {
steps {
script {
def rc = sh(script: "sh A.sh", returnStatus: true)
if (rc != 0) {
error "Failed, exiting now..."
}
}
}
}
}
}

第一个问题,当while/if/etc语句出错时,如何让SHELL脚本失败?我知道我可以使用 命令 || exit 1 但如果我在脚本中有几十个这样的语句,它看起来并不优雅。

第二个问题,我的 Groovy 错误处理是否正确?谁能以更好的方式建议事件?或者也许有一个 Jenkins 插件/官方方法可以这样做?

最佳答案

第一个问题此链接可能有帮助 Aborting a shell script if any command returns a non-zero value

第二个问题:您可以使用 try 和 catch 来改进错误处理。

 try{
def rc = sh(script: "sh A.sh", returnStatus: true)
if (rc != 0) {
error "Failed, exiting now..."
}
}
catch (Exception er){
errorMessage = er.getMessage();
}

关于linux - 当 while/if/etc 出现错误时如何使 bash 脚本失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56886251/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com