Makefile中shell返回值1与固定值1比较始终不相等问题求解
Makefile变量对比失败问题原因及解决方案
核心原因
你遇到的问题90%以上是变量包含多余空白/杂字符+ ifeq 语法误用导致的,具体有几个常见触发点:
ifeq语法中逗号后多余空格会被计入对比值:你写的ifeq ($(EXISTS), 1)中,逗号后的空格会被识别为你要对比的目标值是1(前导带空格),而非单纯的1,只要你的EXISTS变量不带这个前导空格就会匹配失败。$(shell)返回值附带多余内容:- 你的
command_to_exec本身有标准输出/错误输出,这些内容会被一起赋值给EXISTS,导致变量值不是纯1或0 echo输出的末尾换行、赋值语句前后的缩进空格也可能被带入变量
- 你的
- 多余的
eval也可能引入不必要的解析异常,你这个场景完全不需要用eval包裹赋值逻辑。
验证方法
在赋值语句后加一行调试代码,直接打印EXISTS的原始值就能快速定位问题:
$(eval EXISTS=$(shell command_to_exec && echo 1 || echo 0)) # 加下面这行,运行时会直接抛出错误展示变量完整内容,-> <-用来标记变量边界,方便看有没有多余空白 $(error 变量EXISTS的完整内容是: ->$(EXISTS)<-)
修复方案
按照下面的写法修改即可解决问题:
# 1. 去掉多余的eval,直接用立即赋值 # 2. 加>/dev/null 2>&1扔掉command_to_exec本身的所有输出,避免污染结果 # 3. 用strip函数去掉变量前后所有空白、换行字符 EXISTS := $(strip $(shell command_to_exec >/dev/null 2>&1 && echo 1 || echo 0)) # 4. ifeq对比时逗号后不要加多余空格 ifeq ($(EXISTS),1) @echo 'equal' else @echo 'not equal' endif
如果你一定要保留eval写法,也可以按上面的逻辑修改:
$(eval EXISTS=$(strip $(shell command_to_exec >/dev/null 2>&1 && echo 1 || echo 0)))
内容的提问来源于stack exchange,提问作者jacksbox
相关产品推荐
相关产品推荐

