You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile中调用Git的Shell if语句报错(Error 2),求排查

Makefile install目标执行报错(Error 2)的问题排查与修复

问题场景

编写的Makefile install目标执行时总是返回Error 2,错误提示为:

/bin/sh: -c: line 11: syntax error: unexpected end of file
make: *** [mfd/antidote.mak:38: install] Error 2

对应的Makefile代码如下:

.ONESHELL:
install:                                                                                                              
  mkdir -p ${ADDON_PREFIX}/${REPOSITORY_PATH}                                                                         
  repositoryPath=${ADDON_PREFIX}/${REPOSITORY_PATH}/${REPOSITORY_NAME}                                                
                                                                                                                      
  @if [ ! -d $${repositoryPath} ]; then \                                                                            
    git clone --depth=1 \                                                                                             
      https://${REPOSITORY_PATH}/${REPOSITORY_NAME} $${repositoryPath} \                                              
  else \                                                                                                              
    cd $${repositoryPath} && git pull origin main \                                                                   
  fi                                                                                                                  
                                                                                                                      
  ln -sf $${repositoryPath}/${BINARY_NAME} \                                                                  
    ${ADDON_PREFIX}/bin/${REPOSITORY_NAME}                                                                             
.PHONY: install

错误原因

你在使用.ONESHELL伪目标的情况下,给if语句块里的命令加了多余的续行反斜杠\,这是核心问题:

  • .ONESHELL会让Make把目标下的所有命令合并成一个完整的shell脚本,交给单个shell进程执行,不需要用反斜杠来续行
  • 反斜杠会强制吃掉换行符,导致shell解析时if/else/fi的语法结构被打乱,出现“意外文件结束”的语法错误

修复后的代码

去掉if/else/fi语句块中多余的续行反斜杠即可(单个长命令的续行反斜杠可以保留):

.ONESHELL:
install:                                                                                                              
  mkdir -p ${ADDON_PREFIX}/${REPOSITORY_PATH}                                                                         
  repositoryPath=${ADDON_PREFIX}/${REPOSITORY_PATH}/${REPOSITORY_NAME}                                                
                                                                                                                      
  @if [ ! -d $${repositoryPath} ]; then                                                                            
    git clone --depth=1 \                                                                                             
      https://${REPOSITORY_PATH}/${REPOSITORY_NAME} $${repositoryPath}                                                
  else                                                                                                              
    cd $${repositoryPath} && git pull origin main                                                                    
  fi                                                                                                                  
                                                                                                                      
  ln -sf $${repositoryPath}/${BINARY_NAME}                                                                  
    ${ADDON_PREFIX}/bin/${REPOSITORY_NAME}                                                                             
.PHONY: install

内容的提问来源于stack exchange,提问作者Thesevs SCUTULATUS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:42:50