- Você precisa definir
extglob
. - Você precisa dizer ao make para usar bash, não sh.
Makefile:
SHELL=/bin/bash
.SHELLFLAGS="-O extglob -c"
...
Eu quero fazer uma operação em todos os arquivos em uma pasta específica que não inicie com um prefixo específico (digamos, exclude_
). Eu tenho um loop bash for
com um glob estendido 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 uso em um makefile:
target:
for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done
Eu recebo o seguinte erro:
$ 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 algum escape necessário que eu perdi?
Seria mais idiomático e mais portátil resolver isso com o Make e não com os hacks do Bash. E se alguém não tiver o Bash instalado?
De qualquer forma, aqui está a maneira correta de faça em Make:
FOOFILES = $(filter-out foo/bar/exclude_%,$(wildcard foo/bar/*))
target:
for FILE in ${FOOFILES}; do echo $$FILE ; done
Aqui está uma maneira mais simples:
SHELL:=/bin/bash -O globstar
que ativará a opção shell globstar (que também funciona no BSD / OS X).
Adicione isto ao topo do Makefile:
SHELL := bash -O extglob