Linux 当/if/etc有错误时,如何使bash脚本失败?

Linux 当/if/etc有错误时,如何使bash脚本失败?,linux,bash,shell,jenkins,groovy,Linux,Bash,Shell,Jenkins,Groovy,我与Groovy一起运行Jenkins管道作业。Groovy为每个步骤调用bash脚本 如果有什么事情出了差错,我希望整个工作都失败 对于Groovy,我使用returnStatus:true 对于Bash,我使用set-e 但是,如果例如while语句有错误,则带有set-e的bash脚本不会退出。根据“set”的Linux手册页面,这就是实际应该发生的事情。 我想知道在这种情况下如何立即退出 剧本: 詹金斯-user@jenkins~]$cat script.sh #!/bin/bash s

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

如果有什么事情出了差错,我希望整个工作都失败

对于Groovy,我使用
returnStatus:true

对于Bash,我使用
set-e

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

剧本:

詹金斯-user@jenkins~]$cat script.sh #!/bin/bash set-xe FILE=commands.txt echo“在while之前回音” #运行命令文件中的命令 whileread命令 做 $COMMAND 完成<$FILE 回声$? echo“故障后的echos while” 假设“commands.txt”不存在。 运行脚本:

詹金斯-user@jenkins~]$sh script.sh 回荡 script.sh:第13行:commands.txt:没有这样的文件或目录 1. 故障后回声 [詹金斯-user@jenkins~]$echo$? 0 尽管
while
语句返回退出代码1,但脚本继续并成功结束,正如后面检查的那样,使用
echo$?

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

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脚本失败?我知道我可以使用
command | | exit 1
,但如果脚本中有几十条这样的语句,那就显得不优雅了


第二个问题,我的Groovy错误处理正确吗?有谁能推荐一个更好的活动方式吗?或者也许有一个Jenkins插件/官方的方法可以做到这一点?

为什么不在退出代码并返回代码时使用
?(请参阅脚本的此修改版本,最后一行)

詹金斯-user@jenkins~]$cat script.sh #!/bin/bash set-xe FILE=commands.txt echo“在while之前回音” #运行命令文件中的命令 whileread命令 做 $COMMAND 完成<$FILE 状态=$? echo“故障后的echos while” 退出$status
第一个问题此链接可能会有所帮助

第二个问题:您可以使用try-and-catch进行异常处理来改进错误处理

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

您的问题是,尽管使用了
set-e
,但失败重定向不会中止bash脚本。我自己也很惊讶。但这是我对<代码> SET-E/COD>的第一次失望,所以现在我认为不信任它,我滥用诸如“代码> $命令出口1”/代码>…/P> 在这里,您可以执行以下操作:

set -xe -o pipefail
cat $FILE | while read command; do $command ; done
但整个循环应简化为:

bash $FILE

你能解释一下为什么要在顶部添加try/catch吗?不要在stage块中添加try/catch。Try/catch有助于将错误处理与常规代码区分开来。我认为海报的要点是,它不应该在出现错误后到达
echo,而“
行,因为它们的顶部有一个
set-xe
;当while循环失败时,它应该退出。
[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 $?
exit 1
set -xe -o pipefail
cat $FILE | while read command; do $command ; done
bash $FILE