【问题标题】:Shell Commands Using ( on MakefileShell 命令使用 ( 在 Makefile
【发布时间】:2019-08-05 14:39:20
【问题描述】:

我正在准备一些乳胶文件,并决定制作一些 makefile 来帮助我编译和清理 delatex 文件。所以我创建了以下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

在终端上运行良好。 怎么了?我找不到任何错误:/..

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

shopt -s extglob

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

谢谢

【问题讨论】:

    标签: makefile


    【解决方案1】:

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

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

    强制在 bash 中运行此命令并启用extglob

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

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

    或添加:

    SHELL := /bin/bash -O extglob
    

    到您的制作文件。前一个选项仅影响该命令的 shell 调用,后者将适用于您的所有配方(命令)。

    【讨论】:

    • @Ajob 不客气。您可能希望接受答案以结束循环。
    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多