build_build.sh 第 3 行开启了 set -e,而 init_submodules() 里写了这样一段降级重试:
build_build.sh
set -e
init_submodules()
set -e ... init_submodules() { ... git submodule update --recursive --remote if [ $? -ne 0 ]; then log_warn "子模块更新失败,尝试仅同步当前提交..." git submodule update --recursive fi ... }
在 set -e 生效的情况下,git submodule update --recursive --remote 一旦返回非零,bash 会立即终止整个脚本,根本不会执行后面的 if [ $? -ne 0 ] 判断。因此 git submodule update --recursive 这条降级路径是死代码,永远不可能被执行。
git submodule update --recursive --remote
if [ $? -ne 0 ]
git submodule update --recursive
即:作者希望"远程分支同步失败时回退到本地 commit 同步",但实际效果是"远程同步失败就直接退出",与预期相反。
把降级逻辑改成短路形式,让失败退出不触发 set -e:
git submodule update --recursive --remote || { log_warn "子模块更新失败,尝试仅同步当前提交..." git submodule update --recursive }
或临时 set +e 后再检查 $?。建议顺手排查脚本里其他 if [ $? -ne 0 ] 的写法是否存在同样的 set -e 冲突。
set +e
$?
感谢指正,set -e 下子模块更新失败即退出,降级重试确为死代码。我们会对构建脚本进行整改,感谢反馈。
问题现象
build_build.sh第 3 行开启了set -e,而init_submodules()里写了这样一段降级重试:set -e ... init_submodules() { ... git submodule update --recursive --remote if [ $? -ne 0 ]; then log_warn "子模块更新失败,尝试仅同步当前提交..." git submodule update --recursive fi ... }问题分析
在
set -e生效的情况下,git submodule update --recursive --remote一旦返回非零,bash 会立即终止整个脚本,根本不会执行后面的if [ $? -ne 0 ]判断。因此git submodule update --recursive这条降级路径是死代码,永远不可能被执行。即:作者希望"远程分支同步失败时回退到本地 commit 同步",但实际效果是"远程同步失败就直接退出",与预期相反。
建议
把降级逻辑改成短路形式,让失败退出不触发
set -e:git submodule update --recursive --remote || { log_warn "子模块更新失败,尝试仅同步当前提交..." git submodule update --recursive }或临时
set +e后再检查$?。建议顺手排查脚本里其他if [ $? -ne 0 ]的写法是否存在同样的set -e冲突。