繁体   English   中英

当通过make(w / SHELL:= / bin / bash)执行时,为什么bash不支持!(…)模式?

[英]Why won't bash support !(…) patterns when executed via make (w/ SHELL:=/bin/bash)?

我在运行/bin/bash Makefile中运行一行代码时遇到问题。 我知道Make在/bin/sh运行,因此我通过声明Make使其希望在Bash中运行来解决了该指南中的问题 但是,即使我在Bash中运行Make,我仍然无法使这条线正常工作,即使艰难地在Bash中工作也很好。

为什么Bash在Makefile中运行rm -f !(2).txt而不在shell中执行时抛出错误?

编辑:我试图删除具有某些文件扩展名的所有文件,但这些文件之一除外。 rm -f !(2).txt命令在我的bash终端中执行此操作,而不在Make中执行。

编辑:在终端中使用Bash“正常”运行rm -f !(2).txt (在发出命令echo "$0"时终端返回bash ),效果很好,但是我还是运行/bin/bash -c 'rm -f !(2).txt'我得到了与Makefile中相同的错误。

生成文件

all: clean

clean: SHELL:=/bin/bash
clean:
    rm -f !(2).txt

在Bash中运行命令

 $ ls
1.txt  2.txt  3.txt  4.txt  Makefile    # Directory has all text files
 $ rm -f !(2).txt                       # Remove all text files but 2.txt
 $ ls
2.txt  Makefile                         # Only 2.txt is not removed

通过Makefile在Bash中运行命令

 $ ls                                   # Directory has all text files
1.txt  2.txt  3.txt  4.txt  Makefile
 $ make clean                           # Running make 
rm -f !(2).txt
/bin/bash: -c: line 0: syntax error near unexpected token `('
/bin/bash: -c: line 0: `rm -f !(2).txt'
make: *** [clean] Error 1

您需要启用extglob shell选项才能使其工作。 在GNU make中,可以通过以下方式实现

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

由问题作者编辑

上面两行代码的示例对我而言不起作用,但是正如这位研究员发现的那样 ,根据版本,似乎有不同的解决方案。

由于某种原因, .SHELLFLAGS对我不起作用,但是将标志直接放在SHELL=/bin/bash -O extglob -c中可以。 [...] –蒂莫西·琼斯(Timothy Jones)

该示例@choroba使用了Make 4.0中的作品,但由于我拥有Make 3.81,因此不适用于我。 但是,这是我的解决方案:

all: clean

clean: SHELL=/bin/bash -O extglob -c
clean:
    rm -f !(2).txt

Make不知道“!(2).txt”是什么意思,如果确实必须使用此构造,请使用$(shell)函数:

%(shell rm -f !(2).txt)

就个人而言,我会更改您的文件命名方案或在make变量中构建要删除的文件名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM