为什么 m4 -D 选项不进行替换

为什么 m4 -D 选项不进行替换

-DQUOTE=yes下面的代码是如何工作的?

我预计第二行是ifelse(yes,yes,Learn Linux today!)

其他部分对我来说很有意义。

Linux 袖珍指南 - Daniel J. Barrett

$ cat myfile 
My name is NAME and I am AGE years old.
ifelse(QUOTE,yes,Learn Linux today!)


$ m4 -DNAME=Sandy -DAGE=25 -DQUOTE=yes myfile
My name is Sandy and I am 25 years old.
Learn Linux today!

答案1

m4当许多内置处理宏出现在输入中时,处理器会识别它们的名称,并且是ifelse其中之一。

通常m4与其-P选项一起使用以避免意外处理这些指令。使用-P要求您将字符串添加m4_到您想要实际处理的所有内置指令名称的前面,例如m4_definem4_ifelsem4_dnl等。

这可以避免输入中宏指令的大多数意外执行,因为没有前缀的指令m4_不会被视为文本。

$ cat file
My name is NAME and I am AGE years old.
ifelse(QUOTE,yes,Learn Linux today!)
$ m4 -P -DNAME=Sandy -DAGE=25 -DQUOTE=yes file
My name is Sandy and I am 25 years old.
ifelse(yes,yes,Learn Linux today!)

没有-P,则作为多分支- -指令ifelse处理。这条指令是m4ifthenelse记录在这里。简而言之,如果前两个参数相等,则整个指令将被第三个参数替换,这就是您运行初始命令时所看到的:第一个yes(从 的值扩展QUOTE)等于第二个yes,因此Learn Linux today!被扩展。如果您定义QUOTE为另一个字符串,则该ifelse指令将被第四个参数替换,但由于文档中没有任何第四个参数,它将被替换为任何内容(即删除)。

相关内容