首页 > 解决方案 > 在 GNU Make 中转义文件名

问题描述

我的文件名有括号、波浪号等。例如:'Per a què serveixen les equacions de segon grau?.md'.

我有一个简单的 Makefile:

$ cat Makefile 
%.md.html: %.md
    echo $<
    ls $<

当我使用这个 makefile 运行 make 时,我得到了这个错误:

$ make Per\ a\ què\ serveixen\ les\ equacions\ de\ segon\ grau\?.md.html
echo Per a què serveixen les equacions de segon grau?.md
Per a què serveixen les equacions de segon grau?.md
ls Per a què serveixen les equacions de segon grau?.md
ls: no s’ha pogut accedir a 'Per': El fitxer o directori no existeix
ls: no s’ha pogut accedir a 'a': El fitxer o directori no existeix
ls: no s’ha pogut accedir a 'què': El fitxer o directori no existeix
ls: no s’ha pogut accedir a 'serveixen': El fitxer o directori no existeix
ls: no s’ha pogut accedir a 'les': El fitxer o directori no existeix
ls: no s’ha pogut accedir a 'equacions': El fitxer o directori no existeix
ls: no s’ha pogut accedir a 'de': El fitxer o directori no existeix
ls: no s’ha pogut accedir a 'segon': El fitxer o directori no existeix
ls: no s’ha pogut accedir a 'grau?.md': El fitxer o directori no existeix
make: *** [Makefile:3: Per a què serveixen les equacions de segon grau?.md.html] Error 2

因为文件名本身没有转义。无论如何要说类似的话: ls escape($<)在我的makefile中?也许调用 bash 命令?

标签: bashmakefilegnu-make

解决方案


对于这个特定的示例,引用自动变量的将起作用:

echo "$<"
ls "$<"

但是,此技巧不适用于可选的空变量或包含多个文件的变量。由于 GNU Make 如何在列表中使用空格作为分隔符,它总体上不适合处理其中包含空格的文件名。


推荐阅读