Я хочу сделать операцию со всеми файлами в определенной папке, которые не начинаются с определенного префикса (скажем exclude_
). У меня есть for
цикл bash с расширенным глобусом, который выглядит следующим образом:
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
В командной строке это работает нормально:
$ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
foo/bar/apple
foo/bar/pear
foo/bar/banana
Но когда я использую его в make-файле:
target:
for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done
Я получаю следующую ошибку:
$ make
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done'
Есть ли какие-то необходимые побеги, которые я пропустил?
.SHELLFLAGS
меня это не сработало, но поставить флаги прямо у меняSHELL=/bin/bash -O extglob -c
получилось. Есть идеи почему?.SHELLFLAGS
Переменная была добавлена в GNU Make 3.82. Вы можете проверить, какие функции были добавлены в какие выпуски, с помощью файла NEWS: git.savannah.gnu.org/cgit/make.git/tree/NEWSЭто было бы более идиоматичным и более портативным, чтобы решить это с помощью Make, а не с помощью Bash-хаков. Что делать, если у кого-то не установлен Bash?
В любом случае, вот правильный способ сделать это в Make:
источник
Вот более простой способ:
который включит опцию оболочки globstar (которая также работает на BSD / OS X).
источник
Добавьте это в начало Makefile:
источник