makefile 在目标中的多行 IF 条件之前首先评估 $(eval...)



我的问题:Inline $(eval…)先求值,然后"IF"是评估。我对SSM目标的期望是"IF条件首先求值,然后才是$(eval…)

➜ make staging ssm TARGET=i-0d334b9e3f763bfeb
if test "i-0d334b9e3f763bfeb" == "" ; then 
echo "OK"; 


echo "✔ Selected desired nodegroup staging-grafana-v1"; 
echo "✔ Selected desired instgance-id i-07cef18e93c64c795"; 
aws ssm start-session --target i-07cef18e93c64c795; 
else 
echo "✔ Selected desired instgance-id i-0d334b9e3f763bfeb"; 
aws ssm start-session --target i-0d334b9e3f763bfeb; 
fi
✔ Selected desired instgance-id i-0d334b9e3f763bfeb
Starting session with SessionId: master-admin-06c7c2b63ca2554c4
sh-4.2$ 

得到"fzf"如果TARGET为非空,则应该跳过IF顶部块中的相关功能。

也就是:

  • 如果目标是不是
  • 如果TARGET被定义,那么我首先得到两个fzf接口用于模糊搜索,然后才执行ELSE块的步骤。
.PHONY: all
.DEFAULT_GOAL := help
# ----------------------------------------------------------------------------
# Local Variables
#
# ============================================================================
help:
@grep -E '^[.0-9a-zA-Z_-]+:.*?## .*$$' Makefile | awk 'BEGIN {FS = ":.*?## "}; {printf "⚡ 33[34m%-15s33[0m %sn", $$1, $$2}'

staging: ## setup staging env (use: make staging plan)
@echo -n
$(eval export ENVIRONMENT=staging)
prod: ## setup prod env (use: make prod plan)
@echo -n
$(eval export ENVIRONMENT=prod)
.ONESHELL:
ssm:  ## start ssm sessione
if test "$(TARGET)" == "" ; then 
echo "OK"; 
$(eval NG = $(shell aws ec2 describe-instances 
--filter Name=tag:Name,Values=$(ENVIRONMENT)* 
--query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[] | [0]]' 
--output text 
| fzf)) 
$(eval INSTANCE_ID = $(shell aws ec2 describe-instances 
--filter Name=tag:Name,Values=${NG}  
--query 'Reservations[].Instances[].{id: InstanceId}' 
--output text 
| fzf)) 
echo "✔ Selected desired nodegroup ${NG}"; 
echo "✔ Selected desired instgance-id ${INSTANCE_ID}"; 
aws ssm start-session --target ${INSTANCE_ID}; 
else 
echo "✔ Selected desired instgance-id ${TARGET}"; 
aws ssm start-session --target ${TARGET}; 
fi

不要将Make语法与配方中的shell命令混淆。是的,Make在将命令传递给shell之前扩展了$(eval ...函数,甚至在决定是否运行ssm规则之前。

解决方案很简单;这里似乎没有任何理由使用evalNGINSTANCE_ID变量可以是shell变量,而不是Make变量。

ssm:  ## start ssm sessione
if test "$(TARGET)" == "" ; then 
echo "OK"; 
NG=`aws ec2 describe-instances 
--filter Name=tag:Name,Values=$(ENVIRONMENT)* 
--query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[] | [0]]' 
--output text 
| fzf`; 
INSTANCE_ID=`aws ec2 describe-instances 
--filter Name=tag:Name,Values=$$NG  
--query 'Reservations[].Instances[].{id: InstanceId}' 
--output text 
| fzf`; 
echo "✔ Selected desired nodegroup $$NG"; 
echo "✔ Selected desired instgance-id $$INSTANCE_ID"; 
aws ssm start-session --target $$INSTANCE_ID; 
else 
echo "✔ Selected desired instgance-id ${TARGET}"; 
aws ssm start-session --target ${TARGET}; 
fi

(注:如果您打算稍后在其他规则中使用这些变量,那么分配值的if-then-else应该在规则之外,并使用Make语法编写。

相关内容

最新更新