假设我们有几个文件,在 shell 中使用时需要引用其名称:
echo A > 'a.$A'
echo B > 'b.$B'
并且有一个 Makefile,其规则取决于这些文件:
all: a.$$A b.$$B
cat $+
上面的代码适用于名称简单的文件,但适用于它生成的示例中的文件:
cat a.$A b.$B
cat: a.: No such file or directory
cat: b.: No such file or directory
看起来 shell 将$A
and$B
表达式扩展为空字符串。
如果我将变量引用为cat '$+'
,则扩展将被阻止,但所有先决条件都作为单个参数传递:
cat 'a.$A b.$B'
cat: 'a.$A b.$B': No such file or directory
事实上,根据文档:
所有先决条件的名称 [...],它们之间有空格。
问题是,有没有办法获得所有先决条件作为单独的参数,以便能够引用它们?
答案1
使用 GNU Make,您可以使用模式替换将每个单词$+
用单引号引起来:
all: a.$$A b.$$B
cat $(patsubst %,'%',$+)
这不适用于包含空格的先决条件,但 Make 无论如何都无法真正处理这些。