bash 管道构造将某些内容添加到上一个命令的标准输出中

bash 管道构造将某些内容添加到上一个命令的标准输出中

我想使用 sendmail 给我发送东西并且想用一行代码来完成。

echo "mail content" | sendmail emailataddres.com 

发送时无需主题。

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

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

sed 和 awk 的使用和记忆确实很不方便。

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

答案1

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

我非常确定有一个更好的解决方案,但这应该可以。

答案2

要么采用 Claudius 所说的,要么自己做:

〜/ bin /前置:

#!/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!

答案3

这是受到克劳迪斯回答的启发。

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

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

这将给出:

21

答案4

从我收集到的资料来看......你可以做这样的事情:

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

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

当命令被括在 ` 字符中时,它将被执行,并且输出将被就地注入。请记住,这段代码有点危险,因为它可能会内联注入其他命令,这很容易危及您的系统……

****编辑**** 根据 Claudius 的建议,更清洁的选项应如下所示:

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

即使有了那个模板,它也可能被利用。

相关内容