Jenkins Pipeline中处理shell脚本空输出问题的更优方案咨询
问题根因
你遇到的报错本质不是shell输出为空导致的,是Jenkins sh 步骤的默认特性和grep命令的退出码规则共同作用的结果:
- Jenkins的
sh步骤默认会检查命令执行的退出码,只要退出码非0就直接抛出异常,中断后续流程 grep命令没有匹配到任何结果时,默认返回的退出码是1,而非0,所以即使命令本身执行没出错,只要无匹配就会触发sh步骤抛异常
更优解决方案
方案1:修改shell命令忽略grep无匹配的异常(最简洁,适配绝大多数场景)
直接在shell命令末尾加|| true,可以保证整个命令的退出码始终为0,不管grep有没有匹配到结果都不会抛异常,无匹配时trim后的结果就是空字符串,直接判断即可:
list_test = sh(script: 'ls | grep test || true', returnStdout: true).trim() if (list_test) { list_test.each { test -> method(test) } }
方案2:校验命令退出码(适配需要严格区分异常场景的需求)
如果需要区分「grep无匹配」和「命令本身执行错误(比如ls无权限、grep参数错误等)」,可以先通过returnStatus参数获取命令退出码,再根据grep的退出码规则处理:
grep 退出码规则:0=匹配到内容,1=无匹配结果,≥2=命令执行异常
def grepExitCode = sh(script: 'ls | grep test', returnStatus: true) if (grepExitCode == 0) { // 有匹配结果,再获取输出处理 list_test = sh(script: 'ls | grep test', returnStdout: true).trim() list_test.each { test -> method(test) } } else if (grepExitCode >= 2) { println("grep命令执行出错,错误码:${grepExitCode}") // 可根据需求加中断、告警等异常处理逻辑 }
内容的提问来源于stack exchange,提问作者iclman
相关产品推荐
相关产品推荐

