为什么使用“mailx”时“EOT”不结束邮件正文并发送邮件?

为什么使用“mailx”时“EOT”不结束邮件正文并发送邮件?

这是我尝试过的:

$ mailx -s "test email" cloud
Cc: 
"again and agina"
.
EOT

或者,

$ mailx -s "test email" cloud
Cc: 
"this is the first email"
<< EOT

但按下后Enter什么反应也没有。为什么?

答案1

thee-letter-string 并没有什么神奇之处EOT。您可能时常在 shell 脚本中的此处文档重定向中看到它被用作分隔符。几乎任何单词都可以用作此处文档重定向的分隔符,尽管习惯上使用全部大写字母编写的简短描述性单词;例如,您可以mailx通过在其标准输入流上向实用程序提供消息来发送消息,如下所示:

mailx -s 'test message' myself <<'END_MESSAGE'
This is the message.
Possibly on many lines.
END_MESSAGE

这将以mailx非交互方式向用户发送包含两行文本的电子邮件myself。消息正文是'END_MESSAGE',即,由于引用了初始分隔符 ( ) ,shell 不会尝试在其中扩展变量等。

但是,从问题中的两个命令来看,您似乎希望以mailx交互方式在实用程序中输入消息。

如果您dot~/.mailrc文件 ( set dot) 中设置了该选项,则在一行上单独键入一个点正如您在问题的第一部分中所做的那样将结束消息正文并导致发送电子邮件:

$ cat ~/.mailrc
set dot
$ mailx -s 'test message' myself
Cc:
This is the message.
Possibly on many lines.
.

键入单独的点并按下Enter会发送消息。

如果您没有dot设置该选项,或者如果您nodot在 中设置了该选项~/.mailrc,则消息正文将使用Ctrl+D空行来结束。

按 将Ctrl+D当前行发送(commit、提交)到等待输入的程序,如果当前行是空的,这将表示输入结束。这不仅适用于mailx从标准输入流读取交互式输入的大多数程序。

在发出、、 或命令以插入、追加或更改当前编辑缓冲区中的文本后完成输入文本时,在空行上使用.也是您在编辑器中发出用户输入结束信号的方式。如果继承了这个习俗,我不会感到惊讶。ediacmailxed

答案2

作为我的非特权用户,我输入:

$ mailx -s "test email" root <<EOTx
> "this is the first email"
> EOTx
$

过了一会儿:

Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Received: by XXXXXX.home (Postfix, from userid 1000)
        id ADEF4C0CF994; Sat, 27 Aug 2022 20:32:56 +0100 (BST)
Date: Sat, 27 Aug 2022 20:32:56 +0100
To: [email protected]
Subject: test email
User-Agent: Heirloom mailx 12.5 7/5/10
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <[email protected]>
From: XXXXXX <[email protected]>
X-Evolution-Source: mbox:/var/spool/mail/XXXXXX

"this is the first email"

root 的邮件被定向到我的非特权帐户。

多纳尔的评论就其本身而言是准确的,但是<< EOT在这种情况下,您的最后一行是错误的。应该没有EOT重定向。

相关内容