Saya ingin melakukan operasi pada semua file dalam folder tertentu yang tidak dimulai dengan awalan tertentu (katakanlah exclude_
). Saya memiliki bash for
loop dengan gumpalan diperpanjang yang terlihat seperti ini:
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
Di baris perintah, ini berfungsi dengan baik:
$ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
foo/bar/apple
foo/bar/pear
foo/bar/banana
Tapi, ketika saya menggunakannya di makefile:
target:
for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done
Saya mendapatkan kesalahan berikut:
$ 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'
Apakah ada beberapa pelarian yang perlu saya lewatkan?
.SHELLFLAGS
itu tidak berhasil untuk saya, tetapi menempatkan bendera secara langsungSHELL=/bin/bash -O extglob -c
. Ada ide mengapa?.SHELLFLAGS
variabel ditambahkan dalam GNU make 3,82. Anda dapat memeriksa fitur mana yang ditambahkan di mana rilis melalui file NEWS: git.savannah.gnu.org/cgit/make.git/tree/NEWSAkan lebih idiomatis dan lebih portabel untuk menyelesaikan ini dengan Make dan bukan dengan hack Bash. Bagaimana jika seseorang tidak menginstal Bash?
Bagaimanapun, inilah cara yang tepat untuk melakukannya di Make:
sumber
Ini cara yang lebih sederhana:
yang akan mengaktifkan opsi shell globstar (yang juga berfungsi pada BSD / OS X).
sumber
Tambahkan ini ke bagian atas Makefile:
sumber