Makefile中flock命令内多行if条件执行异常求助
问题分析与解决
你的问题核心是shell语法错误和Makefile续行/引号处理不当导致的命令执行异常,具体修正方案如下:
核心错误点
- 混淆了Makefile与shell的条件结束符:你用了
endif,这是Makefile的条件语法关键字,而shell中if语句的结束符是fi,这会导致shell解析混乱,命令被错误执行。 - if语句语法不完整:shell的if必须搭配
then使用,且条件判断要用正确的语法(方括号[],注意前后空格),原代码没有then,导致条件判断后所有命令都会被当作独立命令执行,不管条件真假。 - 条件判断的括号错误:圆括号
()在shell中是用来启动子shell的,不是条件判断的语法,正确的条件判断应该用[ ! -f "FINISHED_build" ]([是test命令的别名)。
修正后的Makefile Target
target: config mkdir -p results; \ cd results; \ flock . -c 'if [ ! -f "FINISHED_build" ]; then \ ln -s $(OUTDIR) output; \ rm -rf work; \ # some other commands \ touch FINISHED_build; \ fi'
关键细节说明
- shell语法修正:
- 用
if [ ! -f "FINISHED_build" ]; then替代原错误写法,;用于分隔条件和then,确保shell能正确识别语法。 - 用
fi替代endif,这是shell结束if语句的正确关键字。
- 用
- Makefile续行处理:
- 每行末尾的反斜杠
\是Makefile的续行符,会把多行合并成一个完整的shell命令字符串传递给flock -c。 - 单引号内部的换行和缩进会被保留(经Makefile续行处理后),shell能正确识别多行脚本结构。
- 每行末尾的反斜杠
- 变量展开:
$(OUTDIR)会被Makefile预先展开成实际路径,再传递给shell执行,符合你的需求。
单行写法(可选)
如果偏好紧凑的单行写法,也可以这样写:
target: config mkdir -p results; \ cd results; \ flock . -c 'if [ ! -f "FINISHED_build" ]; then ln -s $(OUTDIR) output; rm -rf work; touch FINISHED_build; fi'
内容的提问来源于stack exchange,提问作者Merolla
相关产品推荐
相关产品推荐

