无法计算规则中的值并将其写入变量。
有这样一条规则:
elastic-load-balancer:
$(info "running elastic load balancer of yandex cloud")
COMMAND_VAR=...
cd elb && terraform plan
cd elb && terraform apply -auto-approve -var="yandex_compute_instance_group_id=${COMMAND_VAR}"
cd instance_group && echo $(terraform output terraform_group_instance_id)
我需要将命令执行的结果替换并写入变量,而不是省略号terraform output terraform_group_instance_id
。
然后这个变量需要在下面的代码中替换。怎么做?
UPD
$(info "running elastic load balancer of yandex cloud" ${cd instance_group/ && terraform output terraform_group_instance_id})
答案不合适。如果我运行命令,我会得到这条线
正如在另一个答案中已经指出的那样,默认情况下,每个配方行都会启动一个新的 shell 实例。让我提醒您用于描述规则(rule)的术语:
所以。你可以走不同的路:
例如,将变量的赋值和需要它的那些命令组合成一个“连续”行(如果该行以符号 结束
\
,那么它后面的那个被认为是它的直接延续)。即,在配方中替换:类似于:
请注意,我删除了一个对cd的调用。它变得多余。
.ONESHELL
。因此,shell 将在每个配方中调用一次,而不是每个配方中的每行。请记住,例如,cd
需要减少相同的数量。但改变整个方法可能会更好。使其与make程序的主要范例相匹配:仅当目标已更新至少一个先决条件(以及先决条件 -文件,才跟踪文件之间的依赖关系并执行配方(即“更新”目标,即文件) )。
特别是,您可以从写入变量的程序执行结果写入文件开始。
并且已经将此文件作为另一个目标的先决条件,您现在在其配方中替换了变量值,而不是您可以从文件中读取信息。
等等 等等
不过,我要补充一点:是的,当然,经常使用与文件不对应的目标(所谓的“虚假目标”)。他们的主要“问题”是他们“撕裂”了make程序的主要范例:普通目标可能不需要更新(如果先决条件比目标更旧),但“假”目标总是需要更新(配方执行) . 并且它还要求在先决条件中编写的那些目标中也有相同的要求。
我会补充上一个答案,限制范围,你也可以写
您也可以发布公告
这也是正确的。
大多数实现
make
,包括GNU Make,在单独的进程中运行每个命令,因此显然变量不会以这种方式工作。我已经在评论中写信给你关于删除脚本的内容。这是POSIX Make的宏版本: