Je veux faire une opération sur tous les fichiers d'un dossier particulier qui ne commencent pas par un préfixe particulier (disons exclude_
). J'ai une for
boucle bash avec un glob étendu qui ressemble à ceci:
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
Sur la ligne de commande, cela fonctionne bien:
$ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
foo/bar/apple
foo/bar/pear
foo/bar/banana
Mais, quand je l'utilise dans un makefile:
target:
for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done
J'obtiens l'erreur suivante:
$ 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'
Y a-t-il des évasions nécessaires que j'ai ratées?
.SHELLFLAGS
n'a pas fonctionné pour moi, mais mettre les drapeaux directementSHELL=/bin/bash -O extglob -c
a fonctionné. Des idées pourquoi?.SHELLFLAGS
variable a été ajoutée dans GNU make 3.82. Vous pouvez vérifier quelles fonctionnalités ont été ajoutées dans quelles versions via le fichier NEWS: git.savannah.gnu.org/cgit/make.git/tree/NEWSIl serait plus idiomatique et plus portable de résoudre ce problème avec Make et pas avec les hacks Bash. Et si quelqu'un n'a pas installé Bash?
Quoi qu'il en soit, voici la bonne façon de le faire dans Make:
la source
Voici une manière plus simple:
qui activera l'option shell globstar (qui fonctionne également sur BSD / OS X).
la source
Ajoutez ceci en haut du Makefile:
la source