12

Я хочу выполнить операцию со всеми файлами в определенной папке, которые не начинаются с определенного префикса (скажем, 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'

Есть ли какие-то необходимые побеги, которые я пропустил?

4 ответа4

8

Было бы более идиоматичным и более портативным, чтобы решить это с помощью Make, а не с помощью Bash-хаков. Что делать, если у кого-то не установлен Bash?

В любом случае, вот правильный способ сделать это в Make:

FOOFILES = $(filter-out foo/bar/exclude_%,$(wildcard foo/bar/*))

target:
    for FILE in ${FOOFILES}; do echo $$FILE ; done
5
  1. Вам нужно установить extglob .
  2. Вы должны указать make использовать bash, а не sh.

Makefile:

SHELL=/bin/bash
.SHELLFLAGS="-O extglob -c"
 ...
2

Вот более простой способ:

SHELL:=/bin/bash -O globstar

который включит опцию оболочки globstar (которая также работает на BSD/OS X).

0

Добавьте это в начало Makefile:

SHELL := bash -O extglob

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .