我有一个makefile,其中一个规则在recipe中有以下echo:
@echo "DUPW $(VAR1).FILE*"
变量VAR1 = DATA的值。SUBVOL
当在用户a下运行make(在OSS上,类似Unix的操作系统)时,它会以我想要的方式响应它:
DUPW $DATA.SUBVOL.FILE*
但是当在用户B下运行相同的make时,它回显:
DUPW DATA.SUBVOL.FILE*
是什么原因导致两个用户的上述不同行为?
当我按如下方式更改配方时,也会出现不同的行为:
@echo "DUPW $$$(VAR1).DICT*"
但是现在用户A回显错误:
DUPW $.SUBVOL.FILE*
和用户B以我想要的方式响应它:
DUPW $DATA.SUBVOL.FILE*
嗯,我不熟悉OSS,像OS这样的Unix,所以我不知道它的实现是什么。如果运行make --version
,它能告诉你什么有用的信息吗?当然没有我所熟悉的make
实现会同时发出这两种行为。你确定吗两个用户都在运行完全相同的make
实现?
根据POSIX标准,用户B的make
行为基本正确。像这样的recipe行:
@echo "DUPW $(VAR1).FILE*"
将首先展开makefile变量$(VAR1)
(在POSIX make中,反斜杠在任何方面都不特殊;所以如果VAR1
的值是DATA.SUBVOL
展开的结果将是:
@echo "DUPW DATA.SUBVOL.FILE*"
如果想在输出中输入文字$
,可以通过写入$$
来转义make
。然后,由于这是在双引号值中,您还必须从shell转义字面量$
,它使用,因此您将使用:
@echo "DUPW $$$(VAR1).FILE*"
如果在shell命令中改用单引号,可能会更容易理解,这样shell就不会展开。然后你可以省略反斜杠:
@echo 'DUPW $$$(VAR1).FILE*'
我不知道make
的实现是什么,但是用户A看到的行为是错误的/不符合make
的POSIX标准。