Makefile中Shell变量为何出现额外引号?问题排查与解决
问题原因与解决方法
原因
Shell和Makefile对引号的处理逻辑存在差异。在Shell中执行export AWS_REGION="us-east-1"时,Shell会自动剥离外层双引号,实际环境变量的值是us-east-1。但Makefile本身不解析引号,当它把环境变量传递给执行命令的Shell时,会原样带上双引号,导致aws命令收到的region参数是"us-east-1"(带引号),触发格式错误。
解决方法
提供三种可行的处理方式:
清理变量中的引号:在Makefile的deploy目标中,用Make的字符串替换功能去掉环境变量里的引号,示例:
deploy: AWS_REGION=$(subst ",,$(AWS_REGION)) aws lambda update-function-code --function-name your-function-name ...$(subst ",,$(AWS_REGION))会把变量里的双引号替换为空,传递给aws命令的就是干净的us-east-1。设置环境变量时不带引号:在Shell里直接执行
export AWS_REGION=us-east-1,不要加双引号。这样不管是在Shell直接执行命令,还是通过Makefile调用,环境变量的值都是不带引号的正确格式,从根源避免问题。让Shell重新解析变量:把Makefile里的命令用bash的
-c参数包裹,让Shell重新处理环境变量,自动剥离引号,示例:deploy: bash -c 'aws lambda update-function-code --function-name your-function-name ...'
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

