首页 > 解决方案 > 如何让 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

但这也不起作用。

标签: makefilegnu-make

解决方案


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 ...).


推荐阅读