Makefile导出命令填充的bash环境变量不生效如何解决?
Makefile导出环境变量不生效的解决方案
根本原因
- Makefile中任务(recipe)的每一行命令默认会在独立的shell子进程中执行,前一行设置的变量、执行的export操作,不会对后一行命令生效,更不会传递到执行make命令的父shell中。
- 你当前的写法中引用shell变量的符号有误,Makefile中如果要获取shell侧的变量值,需要用
$$转义,否则会被Make解析为自身的内置变量。 - 你的变量名
RESOUCE_GROUP存在拼写错误,正确拼写应为RESOURCE_GROUP,也可能导致命令执行异常。
场景1:仅需要在当前do任务的后续命令中使用该变量
方案1:将相关命令合并为同一shell进程执行
通过反斜杠续行,让所有相关命令运行在同一个shell进程中:
RESOURCE_GROUP=containerresourcegroup STORAGE_ACCOUNT=mycontainerstorage SHARE_NAME=containers do: AZURE_STORAGE_CONNECTION_STRING=$$(az storage account show-connection-string --resource-group ${RESOURCE_GROUP} --name ${STORAGE_ACCOUNT} --query connectionString -o tsv); \ export AZURE_STORAGE_CONNECTION_STRING; \ # 此处编写后续需要用到该变量的命令,示例: echo $$AZURE_STORAGE_CONNECTION_STRING
方案2:开启ONESHELL特性(GNU Make 3.82及以上版本支持)
开启后整个任务的所有命令都会运行在同一个shell进程中:
.ONESHELL: SHELL := /bin/bash .RECIPEPREFIX += RESOURCE_GROUP=containerresourcegroup STORAGE_ACCOUNT=mycontainerstorage SHARE_NAME=containers do: AZURE_STORAGE_CONNECTION_STRING=$(shell az storage account show-connection-string --resource-group ${RESOURCE_GROUP} --name ${STORAGE_ACCOUNT} --query connectionString -o tsv) export AZURE_STORAGE_CONNECTION_STRING # 此处编写后续需要用到该变量的命令,示例: echo $$AZURE_STORAGE_CONNECTION_STRING
场景2:需要让执行make命令的终端shell获取该变量
子进程的环境变量无法反向传递给父进程,因此不能直接通过make执行export实现,需要调整逻辑让终端主动加载变量:
- 先编写一个输出export语句的Make任务:
RESOURCE_GROUP=containerresourcegroup STORAGE_ACCOUNT=mycontainerstorage SHARE_NAME=containers output-env: @echo export AZURE_STORAGE_CONNECTION_STRING="$(shell az storage account show-connection-string --resource-group ${RESOURCE_GROUP} --name ${STORAGE_ACCOUNT} --query connectionString -o tsv)"
- 在终端中执行以下命令加载变量:
eval $(make output-env)
执行后可通过echo $AZURE_STORAGE_CONNECTION_STRING验证变量是否生效。
内容的提问来源于stack exchange,提问作者craig
相关产品推荐
相关产品推荐

