You need to enable JavaScript to run this app. 如何修复Makefile中转换含if egrep的bash脚本出现的语法错误
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 18:18:01