如何通过Makefile获取用户输入并导出为环境变量?请排查代码问题
Makefile环境变量设置问题分析与修复
你的Makefile代码存在三个核心问题:
- 命令行独立shell导致变量无法共享:Makefile中每一行缩进的命令都会启动独立的子shell执行,第一行定义的
region变量在后续行中无法访问,因为它们属于不同的进程。 - 错误引用未定义变量:第二行里的
TF_VAR_region并未实际定义——你只是输出了export TF_VAR_region=$$region的字符串,并没有执行这个export命令,自然不存在这个变量。 - 无法直接修改父shell环境:即使在子shell里执行export,变量也只会存在于子shell中,无法传递到运行
make的父shell,子进程无法修改父进程的环境。
修复方案
要实现让用户输入的变量生效到当前shell,推荐两种实用方式:
方式1:生成配置语句让用户手动加载
修改Makefile,将命令合并到同一个shell进程,并输出环境变量配置命令:
build: @read -p "Enter a Region:" region; \ echo "export TF_VAR_region=$${region}"; \ echo "export PKR_VAR_region=$${region}"
使用时执行:eval $(make build),或者将输出写入文件后source:make build > env.sh && source env.sh
方式2:配套shell脚本提示用户加载
创建setup-env.sh脚本:
#!/bin/bash read -p "Enter a Region:" region read -p "Enter AWS Access Key ID:" access_key_id read -p "Enter AWS Secret Access Key:" secret_access_key cat <<EOF 请执行以下命令加载环境变量: export TF_VAR_region="$region" export PKR_VAR_region="$region" export AWS_ACCESS_KEY_ID="$access_key_id" export AWS_SECRET_ACCESS_KEY="$secret_access_key" EOF
给脚本添加执行权限:chmod +x setup-env.sh,然后修改Makefile调用它:
build: @./setup-env.sh
运行make build后,按照提示执行输出的export命令即可。
内容的提问来源于stack exchange,提问作者gklucard
相关产品推荐
相关产品推荐

