首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >makefile计算$(eval.)首先,在目标中多行IF条件之前

makefile计算$(eval.)首先,在目标中多行IF条件之前
EN

Stack Overflow用户
提问于 2022-05-15 02:16:44
回答 1查看 37关注 0票数 0

我的问题:内联$(eval.)先进行评估,然后对"IF“进行评估。我对SSM目标的期望是:“如果条件首先评估,并且只有$(eval.)

代码语言:javascript
运行
复制
➜ 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$ 

因此,我在IF top块中获得了"fzf“相关功能,由于目标为非空,应该跳过该功能。

所以从本质上说:

  • 如果目标是而不是定义的-事情正在按预期工作。
  • 如果定义了目标,那么我首先得到两个fzf接口进行模糊搜索,然后才执行其他块的步骤。

代码语言:javascript
运行
复制
.PHONY: all
.DEFAULT_GOAL := help

# ----------------------------------------------------------------------------
# Local Variables
#
# ============================================================================

help:
    @grep -E '^[\.0-9a-zA-Z_-]+:.*?## .*$$' Makefile | awk 'BEGIN {FS = ":.*?## "}; {printf "⚡ \033[34m%-15s\033[0m %s\n", $$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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-15 05:21:00

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

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

代码语言:javascript
运行
复制
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

(P.S.如果计划稍后在其他规则中使用这些变量,那么分配值的if-then-else应该在规则之外,并使用Make语法编写。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72245128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档