[英]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
$ 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
$ 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.