Bash розширений глобус всередині Makefile


15

Я хочу зробити операцію над усіма файлами в певній папці, які не починаються з певного префікса (скажімо exclude_). У мене є forпетля bash з розширеним глобусом, який виглядає приблизно так:

for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done

У командному рядку це добре працює:

 $ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
 foo/bar/apple
 foo/bar/pear
 foo/bar/banana

Але, коли я використовую його в makefile:

target:
    for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done

Я отримую таку помилку:

$ 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'

Чи є якісь необхідні втечі, які я пропустив?

Відповіді:


7
  1. Вам потрібно встановити extglob.
  2. Вам потрібно сказати make використовувати bash, не sh.

Makefile:

SHELL=/bin/bash
.SHELLFLAGS="-O extglob -c"
 ...

2
Хм. Чомусь .SHELLFLAGSце не спрацювало для мене, але поставити прапори було SHELL=/bin/bash -O extglob -cзроблено. Будь-які ідеї чому?
Тімоті Джонс

1
Можливо, ви не використовуєте марку GNU. А може, це не потребує цитат.
Ігнасіо Васкес-Абрамс

GNU Make 3.81 та GNU bash, версія 4.1.2. Спробував і без цитат. Дивно.
Тімоті Джонс

У всякому разі, ваша відповідь вирішила це для мене, як тільки я поставив їх усіх в один рядок. Спасибі!
Тімоті Джонс

1
.SHELLFLAGSМінлива була додана в GNU Make 3.82. Ви можете перевірити, які функції були додані у випусках через файл NEWS: git.savannah.gnu.org/cgit/make.git/tree/NEWS
MadScientist

11

Це було б ідіоматичніше і портативніше вирішити це за допомогою Make, а не з хаками Bash. Що робити, якщо хтось не встановив Bash?

У будь-якому випадку, це правильний спосіб зробити це в Make:

FOOFILES = $(filter-out foo/bar/exclude_%,$(wildcard foo/bar/*))

target:
    for FILE in ${FOOFILES}; do echo $$FILE ; done

2

Ось простіший спосіб:

SHELL:=/bin/bash -O globstar

що дозволить включити опцію оболонки globstar (яка працює і на BSD / OS X).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.