使用(在Makefile上)的Shell命令

使用(在Makefile上)的Shell命令,makefile,Makefile,我正在准备一些latex文件,并决定制作一些makefile来帮助我编译和清理反latex文件 aula=listaProb all: compile clean compile: pdflatex $(aula).tex clean: rm -rf !(makefile|$(aula).tex|$(aula).pdf) -v 但当我执行“make”时,我会犯以下错误 rm -rf !(makefile|listaProb.tex|listaProb.pdf) -v /bi

我正在准备一些latex文件,并决定制作一些makefile来帮助我编译和清理反latex文件

aula=listaProb
all: compile clean

compile:
    pdflatex $(aula).tex

clean:
    rm -rf !(makefile|$(aula).tex|$(aula).pdf) -v
但当我执行“make”时,我会犯以下错误

rm -rf !(makefile|listaProb.tex|listaProb.pdf) -v
/bin/sh: 1: Syntax error: "(" unexpected
makefile:8: recipe for target 'clean' failed
make: *** [clean] Error 2
但是命令

rm -rf !(makefile|listaProb.tex|listaProb.pdf) -v
shopt -s extglob
在终端上运行良好。 怎么了?我找不到任何错误:/

另外,我使用这种方式删除文件,因为我想删除除指定文件以外的所有文件。它需要命令

rm -rf !(makefile|listaProb.tex|listaProb.pdf) -v
shopt -s extglob
如果有人知道不用extglob怎么做,那就太好了


谢谢

问题是配方命令被传递到了无法处理该语法的
/bin/sh
。您可以将Makefile更改为:

clean:
    bash -O extglob -c "rm -rf !(makefile|$(aula).tex|$(aula).pdf) -v"
强制在启用
extglob
的情况下在bash中运行此命令

或者为您的
make
定义
SHELL
变量,例如通过运行:

make SHELL="/bin/bash -O extglob" clean
或加入:

SHELL := /bin/bash -O extglob

创建文件。前一个选项仅影响该命令的shell调用,后一个选项将应用于您的所有配方(命令)。

@Ajob不客气。您可能希望接受答案以关闭循环。