文件中的dnl
和有什么区别?如果我想启用某些东西,需要将什么放在前面?同样,如果我想“注释掉”某些东西,我需要什么前缀?dnl #
/etc/mail/sendmail.mc
例如:
dnl # masquerade not just @mydomainalias.com, but @*.mydomainalias.com as well
dnl #
dnl FEATURE(masquerade_entire_domain)dnl
dnl #
dnl MASQUERADE_DOMAIN(localhost)dnl
dnl MASQUERADE_DOMAIN(localhost.localdomain)dnl
dnl MASQUERADE_DOMAIN(foo.com)dnl
dnl MASQUERADE_DOMAIN(foo2.lan)dnl
MAILER(smtp)dnl
MAILER(procmail)dnl
dnl MAILER(cyrusv2)dnl
答案1
dnl
这里和之间存在着微妙但重要的区别#
。
dnl
方法“通过换行符删除”。当你将你的处理sendmail.mc
成sendmail.cf
使用m4
(或可能是某些前端)时,字符dnl
和它们后面的所有内容,包括下一个换行符将被删除。(并且所有这些行结尾以dnl
抑制输出中的多余空行sendmail.cf
。)
任何以 开头dnl
到 行尾 的元素都不会出自sendmail.mc
并进入sendmail.cf
。
当然,输出中剩余的所有内容要么是 sendmail 配置,要么是以 开头的注释#
,它们将按原样复制到 中sendmail.cf
,并在那里被忽略。
任何以 开头#
且未被删除的内容都将被视为sendmail.cf
未受干扰的评论。
在您的示例中,有人希望从中删除所有带注释的功能sendmail.cf
以及评论,因为如果没有这些功能,评论就毫无意义。
答案2
DNL 的意思是“通过换行符删除”,实际上的意思是“忽略‘dnl’之后的所有内容直到下一行”。
“dnl #” 只是人为命名。当 sendmail.mc 文件首次开发时,他们希望您知道,任何“dnl ...”都是注释掉的命令/设置,任何“dnl #...”实际上都是描述性注释,而不是可以取消注释的命令/设置,因为“#”通常用在行首,表示“行末之后的内容”是注释。
答案3
是的,8 岁了,没有人会读到这篇文章,但我只是想指出,dnl
在一行上放两个 s 是完全没有意义的。它不会sendmail.cf
像上面建议的那样“抑制输出中的额外空白行”。
一张图片胜过千言万语:
$ m4 <<EOF
Line 1
dnl Line 2
Line 3
dnl Line 4 dnl
Line 5
# Line 6
Line 7
dnl # Line 8
Line 9
EOF
产生以下输出:
Line 1
Line 3
Line 5
# Line 6
Line 7
Line 9