无法在Makefile中添加条件判断:minikube运行状态检查报错
Makefile条件判断错误排查与解决
问题场景
我尝试在Makefile中添加条件判断,检查minikube是否已运行,若运行则执行同一Makefile中的目标,但findstring的使用似乎存在问题。执行make reset-environment时得到如下错误输出:
minikube type: Control Plane host: Running kubelet: Running apiserver: Running kubeconfig: Configured <-- 代码第48行 kubeconfig <-- 代码第49行 ifeq (kubeconfig) <-- 代码第50行 /bin/bash: -c: line 1: syntax error near unexpected token `kubeconfig' /bin/bash: -c: line 1: `ifeq (kubeconfig)' make: *** [Makefile:50: reset-environment] Error 2
我参照官方文档写的findstring语法,第49行的输出也验证了它能正确提取到kubeconfig,但第50行的条件判断始终报错。修改为ifeq ($(findstring kubeconfig,$(minikube_status)),kubeconfig)后,错误变为:
ifeq (kubeconfig,kubeconfig) /bin/bash: -c: line 1: syntax error near unexpected token `kubeconfig,kubeconfig' /bin/bash: -c: line 1: `ifeq (kubeconfig,kubeconfig)' make: *** [Makefile:50: reset-environment] Error 2
错误原因
核心问题是你把Make的条件语法ifeq写在了shell命令块里。Makefile中,缩进(通常是Tab)的内容会被交给shell执行,而ifeq是Make自身的语法,不是shell命令,所以bash会把它当成无效的shell代码报错。
解决方案
有两种正确的写法:
方案1:使用Make的条件判断(非缩进区域)
先在Make的全局区域获取minikube状态,再用Make的条件语法判断:
# 先获取minikube状态,这是Make变量赋值 minikube_status := $(shell minikube status --output=text) reset-environment: @echo "检查minikube状态..." ifeq ($(findstring kubeconfig,$(minikube_status)),kubeconfig) # 这里缩进的是Make条件成立时要执行的shell命令 @echo "minikube已运行,执行清理操作..." # 调用其他Make目标,比如make clean $(MAKE) clean else @echo "minikube未运行,跳过清理..." endif
方案2:在shell命令中用shell的条件判断
如果要在目标的shell命令里判断,改用shell的语法(比如grep):
reset-environment: @echo "检查minikube状态..." @minikube_status=$$(minikube status --output=text); \ if echo "$$minikube_status" | grep -q "kubeconfig"; then \ echo "minikube已运行,执行清理操作..."; \ make clean; \ else \ echo "minikube未运行,跳过清理..."; \ fi
注意:shell命令块里的多行要加反斜杠\连接,确保在同一个shell进程中执行。
内容的提问来源于stack exchange,提问作者Shaun Worcester
相关产品推荐
相关产品推荐

