在 GNU Make 中转义文件名

escape filenames in GNU Make

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

我有一个简单的 Makefile:

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

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

$ 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

因为文件名本身没有转义。在我的 makefile 中是否有类似这样的说法:ls escape($<)?也许调用 bash 命令?

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

echo "$<"
ls "$<"

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