Github Actions中grep无匹配致脚本步骤失败,如何存储结果?
解决Github Actions中grep无匹配时存入变量且不失败的问题
问题核心是GNU grep和BSD grep的行为差异:Github Actions默认用Ubuntu环境的GNU grep,而Mac用的是BSD grep。当grep -c没找到匹配内容时,GNU grep会返回退出码1,触发Actions的步骤失败;但BSD grep返回退出码0,所以本地运行没问题。
给你几个可行的解决办法:
方法一:强制忽略grep的非0退出码
在grep命令后加|| true,让整个命令块的退出码始终为0,变量能正常接收结果(无匹配时是0):changed_files=$( echo $diff | grep -c src/my_folder || true )方法二:用awk替代grep计数
awk不管有没有匹配都会正常输出计数(无匹配时输出0),且退出码始终为0,完全避开grep的差异问题:changed_files=$( echo $diff | awk '/src\/my_folder/ {count++} END {print count+0}' )方法三:临时关闭shell的错误终止选项(谨慎使用)
如果你的脚本开头用了set -e(遇到错误就终止),可以临时关闭这个选项,执行完grep再恢复:set +e changed_files=$( echo $diff | grep -c src/my_folder ) set -e注意:这个方法会影响这段代码前后的错误处理逻辑,只有在其他方法不适用时再考虑。
内容的提问来源于stack exchange,提问作者michpohl
相关产品推荐
相关产品推荐

