Вопрос или проблема
В чем разница между 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
Здесь есть тонкая, но важная разница между dnl
и #
.
dnl
означает “удалить до конца строки”. Когда вы преобразовываете ваш sendmail.mc
в sendmail.cf
используя m4
(или, возможно, другой интерфейсный инструмент), символы dnl
и все после них, включая следующий перевод строки, будут удалены. (И все эти строки заканчиваются на dnl
, чтобы предотвратить появление пустых строк в выводе sendmail.cf
.)
Ничего, что начинается с dnl
до конца строки, не попадет из sendmail.mc
в sendmail.cf
.
Все, что останется в выводе, конечно же, либо будет конфигурацией sendmail, либо комментарием, начинающимся с #
, который будет скопирован как есть в sendmail.cf
и будет игнорироваться.
Все, что начинается с #
и не было удалено выше, будет внесено в sendmail.cf
как комментарий.
В вашем примере кто-то намеревался удалить все комментированные функции из sendmail.cf
, а также комментарии, поскольку комментарии были бы бессмысленны без присутствия функций.
dnl
означает “удалить до конца строки”, что действительно означает “игнорировать все после ‘dnl’ до следующей строки”.
“dnl #” — это просто искусственная номенклатура. Когда файл sendmail.mc был впервые разработан, хотели, чтобы вы знали, что все, что было “dnl …”, это была команда/настройка, которая была закомментирована, а все, что было “dnl #…”, действительно было описательным комментарием, который не мог быть раскомментирован, потому что ‘#’ часто используется в начале строки, чтобы указать, что “то, что следует до конца строки” — это комментарий.
Да, прошло 8 лет, и никто это не прочитает, но я просто хотел указать, что размещение двух dnl
на строке совершенно бессмысленно. Это не “предотвращает появление дополнительных пустых строк в выводе sendmail.cf
“, как было предложено выше.
Поскольку картинка стоит тысячи слов:
$ m4 <
Оно производит такой вывод:
Line 1
Line 3
Line 5
# Line 6
Line 7
Line 9
Ответ или решение
Вопрос о различии между dnl
и dnl #
в файле sendmail.mc
имеет немалое практическое значение для системных администраторов и специалистов в области ИТ. Эти конструкции играют важную роль в конфигурации сервера Sendmail, поэтому важно понять их функциональность и область применения.
Различия между dnl
и dnl #
в файле sendmail.mc
-
dnl
(Delete to New Line)Использование
dnl
означает, что все символы, начиная сdnl
и далее, до конца строки включительно, будут проигнорированы при преобразовании файлаsendmail.mc
вsendmail.cf
с помощью инструмента макропроцессораm4
. Это позволяет удалить из конфигурации как сами команды, так и комментарии, которые к ним относятся, чтобы они не попадали в итоговый файл конфигурацииsendmail.cf
. -
dnl #
Конструкция
dnl #
в некоторой степени является искусственным приемом. Здесьdnl
выполняет ту же функцию удаления до конца строки, а#
символизирует, что содержание строки — это комментарий. Концептуально, использованиеdnl #
вместо простоdnl
создано для более ясного различия между закомментированными командами и комментариями, которые объясняют, зачем те или иные команды закомментированы.
Комментарии и их роль
-
Записи, начинающиеся с
dnl
, полностью удаляются при обработке: Это означает, что данные строки вообще не окажутся вsendmail.cf
. -
Комментарии с
#
: Все, что начинается с#
и не обработано посредством удаленияdnl
, будет скопировано вsendmail.cf
. Эти комментарии, хотя и присутствуют в итоговом файле, будут игнорироваться сервером Sendmail.
Правильное использование
-
Если вы хотите активировать функциональность, необходимо удалить
dnl
перед нужной командой, чтобы она была включена вsendmail.cf
. -
Если необходимо "закомментировать" строку, следует добавить
dnl
перед ней. Это гарантирует, что строка будет проигнорирована в итоговом файле конфигурации.
Подводя итог, использование dnl
способствует более гибкому управлению конфигурацией Sendmail, позволяя системным администраторам четко удалять или включать функциональность в зависимости от текущих нужд конфигурации. Понимание этой разницы поможет избежать ошибок и обеспечить корректную работу вашей почтовой системы.
Эти детали важны для правильной настройки серверов электронной почты и обеспечивают ясность в документации конфигураций, что особенно актуально для организации процесса командной работы над серверными настройками.