如何使Makefile仅产生不带扩展名的文件名?

时间:2019-02-16 21:31:31

标签: bash makefile

我正在尝试制作一个Makemark文件,该文件将Markdown文件导出为使用与原始Markdown文件相同的文件名的pdf文件。我使用了“ basename”命令,但它生成的是“ inputfile.md.pdf”而不是“ inputfile.pdf”。

请在下面查看我的代码(我改编了我在Internet上找到的代码。谢谢!):

.PHONY: pdf docx apa format

FILES := $(wildcard ./*.md)

pdf:
        for file in $(FILES); do \
            pandoc $$file \
            --bibliography mypath \
            --csl mypath \
            --filter pandoc-citeproc \
            --template eisvogel \
            -o $(basename $$file).pdf; \
            open $(basename $$file).pdf; \
        done

谁能帮助我?我是Makefile(以及一般编程领域)的新手,因此非常感谢您提供任何详细的帮助。

我也在下面尝试了这些代码,但是它们生成了错误消息:

-o $(basename -s ".md" $$file).pdf; \

-o $(basename -s .md $$file).pdf; \

1 个答案:

答案 0 :(得分:1)

$(basename …)的书写方式就是basename make function。通常这是正确的做法,但是您尝试在其变量中引用shell变量file,但该变量在make层不可用。

在这种情况下,在外壳程序级别调用basename Shell实用程序可能是最简单的。因此,您需要转义$来进行shell替换,就像这样:

        -o "$$(basename -s .md $$file)".pdf; \
        open "$$(basename -s .md $$file)".pdf; \

或者,您可以尝试使用foreach将循环移动到make层。