Eu quero fazer uma operação em todos os arquivos em uma pasta específica que não iniciam com um prefixo específico (digamos exclude_
). Eu tenho um for
loop bash com uma glob estendida que se parece com isso:
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
Na linha de comando, isso funciona bem:
$ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
foo/bar/apple
foo/bar/pear
foo/bar/banana
Mas quando eu o uso em um makefile:
target:
for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done
Estou tendo o erro a seguir:
$ 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'
Existe alguma fuga necessária que eu perdi?
.SHELLFLAGS
isso não funcionou para mim, mas colocar as bandeiras diretamenteSHELL=/bin/bash -O extglob -c
funcionou. Alguma idéia do porquê?.SHELLFLAGS
variável foi adicionada no GNU make 3.82. Você pode verificar quais recursos foram adicionados em quais lançamentos através do arquivo NEWS: git.savannah.gnu.org/cgit/make.git/tree/NEWSSeria mais idiomático e mais portátil resolver isso com o Make e não com o Bash hacks. E se alguém não tiver o Bash instalado?
De qualquer forma, aqui está a maneira correta de fazer isso no Make:
fonte
Aqui está uma maneira mais simples:
que ativará a opção de shell globstar (que também funciona no BSD / OS X).
fonte
Adicione isso ao topo do Makefile:
fonte