unix makefile:转义字符/扩展变量因用户而异

rdrgkggo  于 2023-04-11  发布在  Unix
关注(0)|答案(1)|浏览(213)

我有一个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*
ttcibm8c

ttcibm8c1#

嗯,我不熟悉 *OSS,一个类似于Unix的操作系统 *,所以我不知道它的make实现是什么。如果你运行make --version,它会告诉你任何有用的东西吗?我肯定没有熟悉的make实现会发出这两种行为。你确定两个用户都运行 * 完全相同 * 的make实现吗?
基本上,根据POSIX标准,用户B的make的行为是正确的。像这样的配方行:

@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标准。

相关问题