Quiero hacer una operación en todos los archivos en una carpeta particular que no comienzan con un prefijo particular (por ejemplo exclude_
). Tengo un for
bucle bash con un globo extendido que se ve así:
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
En la línea de comando, esto funciona bien:
$ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
foo/bar/apple
foo/bar/pear
foo/bar/banana
Pero, cuando lo uso en un archivo MAKE:
target:
for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done
Obtuve el siguiente error:
$ 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'
¿Hay algún escape necesario que me haya perdido?
.SHELLFLAGS
, no funcionó para mí, pero poner las banderas directamenteSHELL=/bin/bash -O extglob -c
sí. Alguna idea de por qué?.SHELLFLAGS
variable se agregó en GNU make 3.82. Puede verificar qué características se agregaron en qué versiones a través del archivo NEWS: git.savannah.gnu.org/cgit/make.git/tree/NEWSSería más idiomático y más portátil resolver esto con Make y no con los hacks de Bash. ¿Qué pasa si alguien no tiene Bash instalado?
De todos modos, aquí está la forma correcta de hacerlo en Make:
fuente
Aquí hay una manera más simple:
que habilitará la opción de shell globstar (que también funciona en BSD / OS X).
fuente
Agregue esto a la parte superior del Makefile:
fuente