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

Ric*_*lev 0 mailx

这是我尝试过的:

$ mailx -s "test email" cloud
Cc: 
"again and agina"
.
EOT
Run Code Online (Sandbox Code Playgroud)

或者,

$ mailx -s "test email" cloud
Cc: 
"this is the first email"
<< EOT
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 6

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

mailx -s 'test message' myself <<'END_MESSAGE'
This is the message.
Possibly on many lines.
END_MESSAGE
Run Code Online (Sandbox Code Playgroud)

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

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

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

$ cat ~/.mailrc
set dot
Run Code Online (Sandbox Code Playgroud)
$ mailx -s 'test message' myself
Cc:
This is the message.
Possibly on many lines.
.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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