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
相关产品推荐
相关产品推荐

