我有一个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*
1条答案
按热度按时间ttcibm8c1#
嗯,我不熟悉 *OSS,一个类似于Unix的操作系统 *,所以我不知道它的make实现是什么。如果你运行
make --version
,它会告诉你任何有用的东西吗?我肯定没有熟悉的make
实现会发出这两种行为。你确定两个用户都运行 * 完全相同 * 的make
实现吗?基本上,根据POSIX标准,用户B的
make
的行为是正确的。像这样的配方行:将首先展开makefile变量
$(VAR1)
(在POSIX make中,反斜杠没有任何特殊之处;它们只是一个字符,就像任何其他字符一样),因此如果VAR1
的值为DATA.SUBVOL
,则扩展的结果将是:如果你想在输出中放入一个文字
$
,你可以通过写$$
来从make
中转义它。然后,因为这是一个双引号的值,你必须从shell中转义文字$
,它使用\
,所以你可以用途:如果在shell命令中切换到单引号,这样shell就不会扩展,那么理解起来可能会更简单。然后你可以放弃反斜杠:
我不知道使用的是什么
make
的实现,但是用户A看到的行为是错误的/不符合make
的POSIX标准。