Ich möchte eine Operation für alle Dateien in einem bestimmten Ordner ausführen, die nicht mit einem bestimmten Präfix beginnen (z exclude_
. B. ). Ich habe eine Bash- for
Schleife mit einem erweiterten Glob, der so aussieht:
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
Auf der Kommandozeile funktioniert das gut:
$ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
foo/bar/apple
foo/bar/pear
foo/bar/banana
Aber wenn ich es in einem Makefile benutze:
target:
for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done
Ich erhalte folgenden Fehler:
$ 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'
Gibt es eine notwendige Fluchtmöglichkeit, die ich verpasst habe?
.SHELLFLAGS
funktionierte das nicht für mich, aber das Setzen der Flaggen direkt inSHELL=/bin/bash -O extglob -c
tat. Irgendwelche Ideen warum?.SHELLFLAGS
Variable wurde in GNU make 3.82 hinzugefügt. Über die NEWS-Datei können Sie überprüfen, welche Funktionen in welchen Releases hinzugefügt wurden: git.savannah.gnu.org/cgit/make.git/tree/NEWSEs wäre idiomatischer und portabler, dies mit Make und nicht mit Bash-Hacks zu lösen. Was ist, wenn jemand Bash nicht installiert hat?
Wie auch immer, hier ist der richtige Weg , dies in Make zu tun:
quelle
Hier ist ein einfacher Weg:
Dadurch wird die Globstar-Shell-Option aktiviert (funktioniert auch unter BSD / OS X).
quelle
Fügen Sie dies oben im Makefile hinzu:
quelle