Как работает HereDocument

Может кто-нибудь объяснить, как работает приведенная ниже команда? Игнорируйте переключатели команды 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.

Это вообще не должно работать, так как вам не хватает закрывающего разделителя для документа here-doc.

chepner 17.08.2018 14:49

Почему весь командный блок заключен в обратные кавычки? Без них ничего бы не вышло. Добавьте ЗДЕСЬ терминатор и посмотрите, сможете ли вы обойтись без них, так как они в настоящее время являются хакерскими атаками, которые заставляют его попробовать.

Paul Hodges 17.08.2018 15:16

@chepner - это работает, вероятно, из-за обратных кавычек, как сказал Джон.

flipcoin 18.08.2018 12:30

Если бы sendmail произвел какой-либо вывод, он бы не работал.

chepner 18.08.2018 15:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
119
1

Ответы 1

Уловка здесь в том, что - является особенным по сравнению с 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 17.08.2018 15:23

@chepner Удивительно, но обратные кавычки ограничивают размер документа. Попробуйте foo () {`cat << ЗДЕСЬ echo foo`; } Однако этих обратных кавычек там быть не должно. Я почти уверен, что он не хотел выполнять вывод sendmail!

Jon 17.08.2018 15:47

Технически это конец ввода, который завершает здесь документ; обратная кавычка просто ограничивает замену команды.

chepner 17.08.2018 15:50

@chepner Я уверен, что технически ты прав. Но попробуйте из командной строки `cat << HERE \ n echo foo \ n` ...

Jon 17.08.2018 15:57

Спасибо @Jon за объяснение. Но на самом деле функция отправляет почту с содержимым $ body, а не с тем, что вы упомянули, «так что эффект состоит в объединении буквальных строк в начале файла $ body». А содержимое переменной $ body - это некий HTML.

flipcoin 18.08.2018 12:33

Другие вопросы по теме