在 bash 中,我可以这样做:
for name in sqls/*.{schema,migration}.sql; do
echo $name; # some operation on the file name
done
Run Code Online (Sandbox Code Playgroud)
它会输出如下内容:
sqls/0001.schema.sql
sqls/0002.schema.sql
sqls/0003.migration.sql
sqls/0004.schema.sql
sqls/0006.schema.sql
sqls/0007.schema.sql
Run Code Online (Sandbox Code Playgroud)
但是,如果我将相同的循环放入 Makefile:
names:
for name in sqls/*.{schema,migration}.sql; do echo $name; done
Run Code Online (Sandbox Code Playgroud)
输出变成:
sqls/*.{schema,migration}.sql
Run Code Online (Sandbox Code Playgroud)
如何在 Makefile 中做同样的事情?
你想要的是:
names:
for name in sqls/*.{schema,migration}.sql; do\
echo $${name};\ # some operation on the file name
done
Run Code Online (Sandbox Code Playgroud)
如文档中所述,这是访问GNUMake和bash变量之间的区别。这是一个使用两者的简单示例:
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
Run Code Online (Sandbox Code Playgroud)
这i
是一个 bash 变量,LIST
而是一个 GNUMake 变量。
简而言之,如果您需要 bash 来接收美元符号$
,请$$
在您的 makefile 中放置一个双美元符号。(请注意,在 makefiles 或 bash 中使用{}
或()
是等效的。)
小智 4
您需要意识到 {...} 是一个 bash 构造,而 Makefiles 通常启动不支持大括号扩展功能的 sh。
然而一切并没有失去;SHELL := bash
如果您使用 GNU Make,那么您可以通过将这一小行放在 Makefile 的最顶部来告诉 Make 使用 bash 。
归档时间: |
|
查看次数: |
10270 次 |
最近记录: |