Chcę wykonać operację na wszystkich plikach w określonym folderze, które nie zaczynają się od określonego prefiksu (powiedzmy exclude_
). Mam for
pętlę bash z rozszerzoną glob, która wygląda następująco:
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
W wierszu poleceń działa to dobrze:
$ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
foo/bar/apple
foo/bar/pear
foo/bar/banana
Ale kiedy używam go w makefile:
target:
for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done
Otrzymuję następujący błąd:
$ 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'
Czy jest jakaś niezbędna ucieczka, za którą tęskniłem?
.SHELLFLAGS
nie zadziałało to dla mnie, ale bezpośrednie włożenie flagSHELL=/bin/bash -O extglob -c
. Jakieś pomysły dlaczego?.SHELLFLAGS
Zmienna dodano GNU make 3,82. Możesz sprawdzić, które funkcje zostały dodane w których wydaniach za pomocą pliku NEWS: git.savannah.gnu.org/cgit/make.git/tree/NEWSBardziej idiomatyczne i przenośne byłoby rozwiązanie tego problemu za pomocą Make, a nie hacków Bash. Co jeśli ktoś nie ma zainstalowanego Bash?
W każdym razie oto właściwy sposób na zrobienie tego w Make:
źródło
Oto prostszy sposób:
która włączy opcję powłoki globstar (która działa również na BSD / OS X).
źródło
Dodaj to na górze pliku Makefile:
źródło