sendmail.mc 文件中的“dnl”和“dnl #”有什么区别?

sendmail.mc 文件中的“dnl”和“dnl #”有什么区别?

文件中的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.mcsendmail.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

相关内容