我有一个基本的make实验,我试图从具有可变替换的模板创建一个新文件,基本上:
GETCONFIG = $(shell ./test.sh getvalue $(1) app.config.sh)
DOCKERFILE := $(call GETCONFIG,DOCKERFILE)
DOCKERFILE_TEMP := $(call GETCONFIG,DOCKERFILE_TEMPLATE)
DOCKERFILE_TEMPLATE := $(shell cat `./test.sh getvalue DOCKERFILE_TEMPLATE app.config.sh`)
all:
echo $(DOCKERFILE_TEMP)
echo $(DOCKERFILE_TEMPLATE)
echo $(DOCKERFILE_TEMPLATE:{port}=80)
$(file > $(DOCKERFILE),$(DOCKERFILE_TEMPLATE:{port}=80))
我的模板文件很基本:
FROM node:4.3
EXPOSE {port}
实验的结果是:
echo Dockerfile.template
Dockerfile.template
echo FROM node:4.3 EXPOSE {port}
FROM node:4.3 EXPOSE {port}
echo FROM node:4.3 EXPOSE 80
FROM node:4.3 EXPOSE 80
因此,部分成功,但最后一个echo语句和创建的文件都在一行上 - 模板文件没有换行符。另外,你很快就注意到我没有使用GETCONFIG来设置DOCKERFILE_TEMPLATE。问题:
我还邀请了关于"更好"整体练习,但我对这篇文章的关注点是上面的两个问题。谢谢。
答案 0 :(得分:0)
您无法使用$(shell ...)
保留换行符。在这方面,它就像炮弹中的反击。文档很清楚:
唯一的处理结果就是转换每个换行符 (或回车/换行对)到一个空格。如果有的话 尾随(回车和换行)换行符将被删除。
我无法想到用纯GNU make进行这种处理的方法。但是您似乎已经使用了各种shell工具,那么为什么不使用合适的shell工具来执行此操作,例如sed
?