Linux

為什麼 m4 -D 選項不做替換

  • November 18, 2021

-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!

m4輸入中出現許多內置處理宏時,處理器會辨識它們的名稱,並且ifelse是其中之一。

通常使用m4它的-P選項來避免意外處理這些指令。使用-P要求您將字元串m4_添加到您想要實際處理的所有內置指令名稱之前,例如m4_define, m4_ifelse,m4_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則作為m4多分支if–指令處理then此處記錄了else此說明。簡而言之,如果前兩個參數相等,則整個指令將被第三個參數替換,這就是您在執行初始命令時看到的:第一個(從 的值擴展)等於第二個,所以被擴展。如果您定義為另一個字元串,該指令將被第 4 個參數替換,但正因為您的文件中沒有任何第 4 個參數,它將被任何內容替換(即刪除)。yes``QUOTE``yes``Learn Linux today!``QUOTE``ifelse

引用自:https://unix.stackexchange.com/questions/678044