bash管道构造将某些内容添加到先前命令的stdoutput中


25

我想使用sendmail向我发送内容,并希望在oneliner中进行。

echo "mail content" | sendmail emailataddres.com 

发送时不带主题。

主题行必须位于Mail内容之前,因此我正在寻找类似于以下内容的内容:

echo "mail content" | prepend "Subject: All that matters" | sendmail emailataddres.com 

sed和awk使用和记忆起来确实很笨拙。

编辑:只是要澄清:回显“邮件内容”只是一个说明性的示例。我需要能够将东西添加到任何来源的stdout流中。例如:ifconfig,zcat等。


echo -e "Subject: All that matters\nmail content"?或与平台无关的其他:printf 'Subject: %s\n%s\n' "All that matters" "mail content"。您还可以编写一个小的脚本,该脚本仅使用两个字符串参数来制作更简单的单行代码。
丹尼尔·安德森

好吧,如果您将此添加为答案,我可能会接受... :)
AndreasT 2012年

啊,不,我不,对不起。请考虑我的编辑。
AndreasT

应该prepend怎么办?为了知道如何添加某些内容,您必须等到上游命令(例如echo)发送EOF 为止,以便您可以在将数据传递到stdout之前将其插入流中,然后再将其传递给sendmail。听起来像是一个矮小的Ruby或Python脚本的任务。
allquixotic

1
稍微不同的方法是使用mail命令(有时称为bsdmail)而不是sendmail直接使用。mail采取可选-s subject选项,例如: ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
Wim Lewis

Answers:


43
$ echo 1 | (echo 2 && cat)
2
1

我很确定有更好的解决方案,但是应该可以。


1
简单,实用和演示。+1
Hennes 2013年

有没有中断返回的简单方法吗?
VenomFangs

2
@VenomFangs使用printf而不是第二个echo,您应该没问题
Trendfischer 2015年

>是否有一种简单的方法可以在没有休息返回的情况下进行?-– echo -n
kyb

6

要么使用克劳迪乌斯所说的话,要么自己做:

〜/ bin / prepend:

#!/bin/sh
echo -en "$@"
cat -

例如:

$ echo "Splendid SUPANINJA! Let's do it!" |\
     prepend "Subject: Venetian Snares\n"

Subject: Venetian Snares
Splendid SUPANINJA! Lets do it!


6

这是受克劳迪乌斯答案的启发。

如果您不希望在输出之间返回中断,请添加-n参数。看起来像:

$ echo 1 | (echo -n 2 && cat)

这将给:

21


1
实际上,不,它不会。它给出“ 2 \ n1”。您必须将“ -n”附加到第二个回显。仍然+1。如果您纠正这一点,我可能会接受。我不确定什么是公平的,因为Claudius对解决方案的贡献最大。
AndreasT 2015年

对不起,以为我放-n错了地方。总之,更新应该给“21 \ n”,如果你想摆脱\ n那么就在1之前加一个-n
VenomFangs

1

从我收集的作品中,您可以做这样的事情:

echo "Subject: All that matters
`echo "mail content"`" | sendmail blah@blahblah

注意,我没有关闭第一行的引号...因为不是所有的shell都将其\n转换为换行符...但是我还没有找到一个不会在引号内处理实际换行符的行。

当命令包含在`字符中时,将执行该命令并将输出注入到位。请记住,这段代码有点危险,因为有可能内联注入其他命令,这些命令很容易危及您的系统...

****编辑****根据克劳迪乌斯(Claudius)的建议,一个更清洁的选项如下所示:

echo -e "Subject: All that matters \n $(echo "mail content") |sendmail blah@blahblah

即使有了该模板,它也可以被利用。


1
通常比使用$()``'' 更好,因为它应该更便携(也更易读)。此外,您可以使用echo-e选项来使其转换换行符(echo -e "1\n2"),或仅使用Daniel在第一条注释中建议的printf。
克劳迪乌斯2012年

发布我的答案后,我会立即阅读您的&更好地喜欢它。好点。
TheCompWiz 2012年

0

您可以使用流程替换在管道输出之前添加:

$ echo "mail content" | cat <(echo "Subject: All that matters") -
Subject: All that matters
mail content
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.