Bash 在 Makefile 中扩展了通配符

Bash 在 Makefile 中扩展了通配符

我想对特定文件夹中不以特定前缀 (例如exclude_) 开头的所有文件执行操作。我有一个带有扩展 glob 的 bashfor循环,如下所示:

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'

我是否错过了一些必要的转义?

答案1

  1. 您需要设置extglob
  2. 您需要告诉 make 使用 bash,而不是 sh。

生成文件:

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

答案2

使用 Make 而不是 Bash hack 来解决这个问题会更符合习惯且更便携。如果有人没有安装 Bash 怎么办?

无论如何,这是合适的方式在 Make 中执行此操作:

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

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

答案3

这是一个更简单的方法:

SHELL:=/bin/bash -O globstar

这将启用 globstar shell 选项(在 BSD/OS X 上也能起作用)。

答案4

将其添加到 Makefile 的顶部:

SHELL := bash -O extglob

相关内容