在 bash 中,我可以这样做:
for name in sqls/*.{schema,migration}.sql; do
echo $name; # some operation on the file name
done
它会输出类似这样的内容:
sqls/0001.schema.sql
sqls/0002.schema.sql
sqls/0003.migration.sql
sqls/0004.schema.sql
sqls/0006.schema.sql
sqls/0007.schema.sql
但是,如果我将相同的循环放入 Makefile 中:
names:
for name in sqls/*.{schema,migration}.sql; do echo $name; done
输出变为:
sqls/*.{schema,migration}.sql
我如何在 Makefile 中做同样的事情?
答案1
你想要的是:
names:
for name in sqls/*.{schema,migration}.sql; do\
echo $${name};\ # some operation on the file name
done
正如中所解释的文档,这就是访问之间的区别GNUMake和巴什变量。这是一个使用两者的简单示例:
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
这i
是一个 bash 变量,而LIST
是一个 GNUMake 变量。
简而言之,如果您需要 bash 接收美元符号,请在 makefile 中$
添加双美元符号。 $$
(请注意,使用{}
or()
是makefile 或 bash 中的等效项.)
答案2
您需要意识到 {...} 是一个 bash 构造,而 Makefiles 通常启动不支持大括号扩展功能的 sh。
然而一切并没有失去;如果您使用 GNU Make,那么您可以通过将这一小行放在SHELL := bash
Makefile 的最顶部来告诉 Make 使用 bash。