Может кто-нибудь объяснить, как работает приведенная ниже команда? Игнорируйте переключатели команды sendmail как таковые - я знаю, как это работает. Я хочу знать, как работает остальная часть команды, то есть здесь-документ (без завершения), чтение кота из stdin и как он передается по конвейеру в sendmail.
SEND_MAIL()
{
`cat - $body <<HERE | /usr/lib/sendmail -oi -t
From: $SENDER
To: $RECEIVER
Subject: $SUBJECT
Content-Type: text/html; charset=us-ascii
MIME-Version: 1.0`
}
Обновление:
Чтобы ответить на некоторые недоразумения, приведенный выше код был написан кем-то другим и, что удивительно, действительно работает. Автор кода просто выполняет функцию, и он успешно отправляет письмо получателю с содержимым $ body.
Почему весь командный блок заключен в обратные кавычки? Без них ничего бы не вышло. Добавьте ЗДЕСЬ терминатор и посмотрите, сможете ли вы обойтись без них, так как они в настоящее время являются хакерскими атаками, которые заставляют его попробовать.
@chepner - это работает, вероятно, из-за обратных кавычек, как сказал Джон.
Если бы sendmail произвел какой-либо вывод, он бы не работал.





Уловка здесь в том, что - является особенным по сравнению с cat. Это заставляет cat читать "файл" со стандартного ввода. Документ здесь записывает буквальные строки в стандартный ввод cat, так что эффект заключается в объединении буквальных строк в начале файла $body.
Похоже, что Bash принимает отсутствующий разделитель здесь-документа в обратных кавычках, хотя и скулит:
$ `cat <<HERE
echo foo
`
bash: warning: here-document at line 1 delimited by end-of-file (wanted `HERE')
foo
$
Кстати, эти обратные кавычки - не то, что вам нужно. Пытаться
SEND_MAIL()
{
cat - $body <<HERE | /usr/lib/sendmail -oi -t
From: $SENDER
To: $RECEIVER
Subject: $SUBJECT
Content-Type: text/html; charset=us-ascii
MIME-Version: 1.0
HERE
}
Однако отсутствие разделителя вызовет другие ошибки; в данном примере определение функции никогда не завершается, потому что закрывающий } все еще является частью здесь документа.
@chepner Удивительно, но обратные кавычки ограничивают размер документа. Попробуйте foo () {`cat << ЗДЕСЬ echo foo`; } Однако этих обратных кавычек там быть не должно. Я почти уверен, что он не хотел выполнять вывод sendmail!
Технически это конец ввода, который завершает здесь документ; обратная кавычка просто ограничивает замену команды.
@chepner Я уверен, что технически ты прав. Но попробуйте из командной строки `cat << HERE \ n echo foo \ n` ...
Спасибо @Jon за объяснение. Но на самом деле функция отправляет почту с содержимым $ body, а не с тем, что вы упомянули, «так что эффект состоит в объединении буквальных строк в начале файла $ body». А содержимое переменной $ body - это некий HTML.
Это вообще не должно работать, так как вам не хватает закрывающего разделителя для документа here-doc.