Shell命令在Makefile上使用(

时间:2019-03-14 15:57:08

标签: makefile

我正在准备一些乳胶文件,并决定制作一些makefile来帮助我编译和清理de Latex文件。所以我创建了以下makefile文件

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

在终端上工作正常。 怎么了?我找不到任何错误:/ ..

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

shopt -s extglob

使用前。如果有人知道如何在不使用extglob的情况下做到这一点,那就太好了。

谢谢

1 个答案:

答案 0 :(得分:2)

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

clean:
    bash -O extglob -c "rm -rf !(makefile|$(aula).tex|$(aula).pdf) -v"

要强制在打开extglob的情况下在bash中运行该命令。

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

make SHELL="/bin/bash -O extglob" clean

或添加:

SHELL := /bin/bash -O extglob

到您的make文件。前一个选项仅影响该命令的外壳程序调用,后一个选项将应用于您的所有配方(命令)。