makefile - 如何让 make 运行使用 make 变量在其中创建 azure 服务主体的命令
问题描述
我的 Makefile 中有以下规则:
setSPRole:
az role assignment create --assignee $(appId) --scope $(az acr show --name $(acr_name) --query id --output tsv) --role acrpush
在我拥有的文件顶部,
include .env
以便我可以使用 appId 和 acr_name
但是,当我运行make setSPRole
结果时,我得到的是:
az role assignment create --assignee "MY_ACTUAL_APP_ID" --scope --role acrpush
如您所见,范围为空,但 appId 已正确填写。 如何获得范围以使用 az acr show 命令的值?
我尝试了什么:我尝试分配值,然后在下一行使用它,如下所示:
setSPRole:
ACR_REG_ID = az acr show --name $(acr_name) --query id --output tsv; \
az role assignment create --assignee $(appId) --scope $(ACR_REG_ID) --role acrpush
但这也不起作用。
解决方案
make 规则中的配方是 shell 脚本。Make 调用 shell 来运行它们。因此,您放入配方的命令(使用 TAB 缩进)必须是有效的 shell 命令。
知道了这一点,也许您可以看到为什么您的第二个示例不起作用:这不是一个有效的 shell 脚本(如果您在 shell 提示符下键入它,您将得到与 make 运行它时相同的错误)。
然而,make 使用$
前缀来扩展它自己的变量(和函数,在 GNU make 中)。$(foo)
因此,在调用 shell 之前,像or这样的文本${foo}
会被 make 扩展,并将扩展的结果发送到要运行的 shell。
知道了这一点,也许您可以看到为什么您的第一个示例不起作用:该字符串$(az acr show ...)
被认为是一个长的 make 变量名称,它从未设置过,因此它扩展为空字符串。
在 make 配方中,如果您想隐藏$
make 以便将其传递给 shell,您可以通过编写两次来逃避它:$$(az acr show ...)
.
推荐阅读
- sql-server - 如何在sql查询中将多列设置为行
- ruby-on-rails - 如何将字段保存为其他表中的其他字段?
- javascript - How do I use an Axios response as a parameter in a for loop?
- python - Testing membership in list of Enum fails
- php - 如何根据postgresql查询中的日期在“where”子句中动态传递季度值
- vue.js - v-select/Vue:如何输入不在列表中的值?
- mysql - Laravel 复合主键关系
- javascript - 在java脚本中处理对象数组的有效方法
- sql-server - 如何在 SQL Server 中缩短此 LIKE 语句?
- vue.js - axios then 函数也确实catch?