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지시문은 네 번째 인수로 대체되지만 문서에 네 번째 인수가 없으므로 다른 항목으로 대체됩니다(즉, 제거됨).

관련 정보