直接粘贴到我的外壳中,以下尝试了3条正则效果(请参阅*.{jpg,png,gis.tif}
):
for file in ./output/India/*.{jpg,png,gis.tif}; do echo $file; openssl base64 -in $file -out ./output/India/`basename $file`.b64; done;
作为一个makefile过程,它失败并返回:
task:
for file in ./output/India/*.{png,jpg,gis.tif} ;
do echo $$file ; openssl base64 -in $$file -out ./output/India/`basename $$file`.b64;
done
和返回:
47910543179104:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('./output/India/*.{png,jpg,gis.tif}','r')
为什么当bash在makefile中时,此表达式不起作用?
我被提示给我绘制 make 如何为您做繁重的素描。
因此,您要将output/India/
中的所有源文件(.jpg
,.png
,.gis.tif
)转换为其基本64编码的等效物。草图:
.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 …)
。哦,好。
那么,我们在这里有什么优点?
-
make -j5
将立即进行5个转换。如果您有四个CPU - 转换停止在第一个错误(如磁盘完整说)
- 自上次转换以来没有更改的文件未重新转换
- 没有狡猾的壳语法(尽管 sh 是 make )的重要组成部分)
未经测试的btw。对不起。
默认情况下使用/bin/sh
,并且不支持Brace扩展。
通过在makefile内部设置SHELL
变量,请不要在制造规则中使用brace扩展,或者运行脚本而不是直列配方(可以由 bash
/etc运行脚本,请不要使用brace扩展,要么告诉使用其他外壳。。