如何修复Makefile中转换含if egrep的bash脚本出现的语法错误
Makefile内嵌bash脚本报错修复方案
报错原因
- Make默认会为目标下的每一行命令单独启动一个shell进程执行,你拆分多行书写的if分支逻辑被切割到多个独立shell上下文运行,语法不完整触发报错。
- Make默认调用
/bin/sh执行命令,部分语法和bash存在差异也可能导致兼容问题。
修复方法
方法1:行尾加反斜杠续行(兼容所有版本GNU Make)
将多段shell逻辑通过反斜杠拼接为同一个shell执行批次,注意语句之间用分号分隔,缩进必须使用TAB字符:
check: if egrep -r 'my_pattern' ./template_builder; then \ exit 1; \ elif egrep -r 'my_second_pattern' ./template_builder; then \ exit 1; \ fi
方法2:使用.ONESHELL特性(GNU Make 3.82及以上版本支持)
直接声明整个目标的命令在同一个shell进程中运行,不需要额外添加续行符:
# 可选指定用bash执行,避免sh兼容问题 SHELL := /bin/bash .ONESHELL: check: if egrep -r 'my_pattern' ./template_builder then exit 1 elif egrep -r 'my_second_pattern' ./template_builder then exit 1 fi
简化写法
你的需求本质是匹配到指定字符就退出报错,可以直接简化为一行命令,不需要写if分支:
check: ! egrep -r 'my_pattern\|my_second_pattern' ./template_builder
匹配到关键词时egrep返回状态码0,加!后状态码翻转为非0,make会自动终止执行并报错,和原逻辑完全等价。
内容的提问来源于stack exchange,提问作者Dimitri Leurs
相关产品推荐
相关产品推荐

