在Makefile中传递变量



我正在使用Makefile来运行各种Docker -compose命令,我正在尝试捕获在本地机器上运行的脚本的输出,并将该值传递给Docker映像。

start-service:
VERSION=$(shell aws s3 ls s3://redact/downloads/1.2.3/) && 
docker-compose -f ./compose/docker-compose.yml run 
-e VERSION=$$(VERSION) 
connect make run-service

当我运行这个,我可以看到变量被分配,但它仍然错误。为什么值没有被传递到-e参数中:

VERSION=1.2.3-build342 && 
docker-compose -f ./compose/docker-compose.yml run --rm 
-e VERSION?=$(VERSION) 
connect make run-connect
/bin/sh: VERSION: command not found

您在这里混合了几种不同的Bourne shell和Make语法。Make$$(VERSION)转换为shell$(VERSION),这是命令替换语法;GNU Make$(shell ...)通常在错误的时间扩展,这不是您想要的。

如果你把它写成一个普通的shell命令,它看起来就像

# Set VERSION using $(...) substitution syntax
# Refer to just plain $VERSION
VERSION=$(aws s3 ls s3://redact/downloads/1.2.3/) && ... 
-e VERSION=$VERSION ... 

所以当你在Make上下文中使用它时,如果没有一个变量是Make变量(它们在同一个命令中被设置和使用),只需将$加倍到$$,而不是转义它们。

start-service:
VERSION=$$(aws s3 ls s3://redact/downloads/1.2.3/) && 
docker-compose -f ./compose/docker-compose.yml run 
-e VERSION=$$VERSION 
connect make run-service

最新更新