直接粘贴到我的shell中,以下尝试3个正则表达式中的每一个并且有效(参见<source path="plugin/campaign/rpc">
<exclude name="**/impl/**"/>
</source>
):
*.{jpg,png,gis.tif}
作为makefile进程,它失败并返回:
for file in ./output/India/*.{jpg,png,gis.tif}; do echo $file; openssl base64 -in $file -out ./output/India/`basename $file`.b64; done;
并返回:
task:
for file in ./output/India/*.{png,jpg,gis.tif} ; \
do echo $$file ; openssl base64 -in $$file -out ./output/India/`basename $$file`.b64; \
done
为什么当Bash在makefile中时,这个表达式不起作用?
答案 0 :(得分:5)
我被提示勾勒出 make 如何为你做繁重的工作。
因此,您希望将.jpg
中的所有源文件(.png
,.gis.tif
,output/India/
)转换为其base64编码的等效文件。草图:
.PHONY: all
all: # default target
dir := output/India/
exts := jpg png gis.tif
wildcards := $(addprefix ${dir}*.,${exts})
sources := $(wildcard ${wildcards})
targets := $(addsuffix .b64,${sources})
${targets}: %.b64: %
openssl base64 -in $< -out $@
all: ${targets}
all: ; : $@ Success
这比它需要的更冗长,通常我反对使用$(wildcard …)
。哦,好吧。
那么我们在shell版本上有什么优势呢?
make -j5
将同时进行5次转化。如果你有四个CPU,那就好了UNTESTED BTW。抱歉。
答案 1 :(得分:4)
默认使用/bin/sh
,它不支持大括号展开。
通过在makefile中设置SHELL
变量告诉make使用不同的shell,不要在make规则中使用大括号扩展,或者运行脚本而不是内联配方(可以运行哪个脚本)由bash
/ etc。)。