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



我有一个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标准。

相关内容

  • 没有找到相关文章

最新更新