В 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?
Вы должны понимать, что {...} является конструкцией bash, в то время как файлы Makefile обычно запускают sh, который не поддерживает функцию расширения скобок.
Однако еще не все потеряно; если вы используете GNU Make, вы можете указать Make
использовать bash, поместив эту маленькую строчку SHELL: = bash
в самый верх
вашего Makefile.
Вам нужно:
names:
for name in sqls/*.{schema,migration}.sql; do\
echo $${name};\ # some operation on the file name
done
Как объясняется в документах , в этом разница между доступом к переменным GNUMake и bash . Вот простой пример использования обоих:
LIST = one two three
all:
for i in $(LIST); do \
echo $$i; \
done
Здесь i
— переменная bash, а LIST
— переменная GNUMake.
Короче , если вам нужен bash для получения знака доллара $
, поместите двойной знак доллара $$
в ваш make-файл. (Обратите внимание, что использование {}
или ()
эквивалентно в make-файлах или bash .)