前のコマンドのstdoutputに何かを付加するbashパイプ構造


23

sendmailを使用してデータを送信し、onelinerで実行したい。

echo "mail content" | sendmail emailataddres.com 

件名なしで送信します。

件名はメールコンテンツの前にある必要があるため、次の行に沿って何かを探しています。

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

sedとawkは、使用して覚えるのが本当に面倒です。

編集:明確にするために:echo "Mail content"は単なる例です。任意のソースからの標準出力ストリームに何かを追加できる必要があります。例:ifconfig、zcatなど。


echo -e "Subject: All that matters\nmail content"?以上のプラットフォームに依存しません:printf 'Subject: %s\n%s\n' "All that matters" "mail content"。また、2つの文字列引数を取り、さらに単純な1行を作成する小さなスクリプトを作成することもできます。
ダニエルアンダーソン

これを答えとして追加すると、私はそれを受け入れるかもしれません... :)
AndreasT

ああ、いや、申し訳ありません。私の編集を考慮してください。
-AndreasT

どうすればprependいいですか?何かを追加する方法を知るためには、上流コマンド(例えばecho)がEOFを送信するまで待たなければなりません。そのため、ストリームの前にデータを挿入してから、stdoutに渡してsendmailにパイプされます。短いRubyまたはPythonスクリプトのタスクのように聞こえます。
-allquixotic

1
少し異なるアプローチはmailsendmail直接ではなくコマンド(bsdmailと呼ばれることもあります)を使用することです。オプションをmail取り-s subjectます。例: ifconfig -a | mail -s 'Current ifconfig output' me@someaddr.com
Wim Lewis

回答:


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

より良い解決策があると確信していますが、これで十分です。


1
シンプルで機能的で実証済み。+1
ヘネス

休憩を返さずにそれを行う簡単な方法はありますか?
VenomFangs

2
@VenomFangs printf2番目の代わりに使用し、echo大丈夫である必要があります
-Trendfischer

>休憩を返さずにそれを行う簡単な方法はありますか?-– 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!


5

これは、クラウディウスの答えに触発されています。

出力間にブレークリターンが必要ない場合は、-nparamを追加します。これは次のようになります。

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

与えるもの:

21


1
実際には、そうではありません。「2 \ n1」が得られます。2番目のエコーに「-n」を付加する必要があります。まだ+1。あなたがそれを修正したら、私はそれを受け入れるかもしれません。Claudiusがソリューションに最も貢献していたため、何が公正かはわかりません。
AndreasT

申し訳ありません-nが、間違った場所に置いたと思います。とにかく、\ nを
削除

1

私が集めた作品から...次のようなことができます:

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

最初の行の引用符を閉じなかったことに注意してください...すべてのシェル\nが改行文字に変換されるわけではありません...しかし、引用符内の実際の改行を処理しないものはまだ見つかりません。

コマンドが `文字で囲まれている場合、コマンドが実行され、出力がインプレースで挿入されます。このコードは、システムを簡単に危険にさらす可能性のある追加のコマンドをインラインで挿入できるため、少し危険です。

****編集**** Claudiusのアドバイスに従うと、よりクリーンなオプションは次のようになります。

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

そのテンプレートでも、悪用される可能性があります。


1
通常$()は、「より移植性の高い(そして読みやすい)であることを前提としているため、」よりも使用する方が適切です。さらに、echo-eオプションを使用して改行(echo -e "1\n2")を翻訳するか、最初のコメントでDanielが提案したとおりにprintfを使用することができます。
クラウディウス

私の答えを投稿した直後に...私はあなたのものを読んで、それが好きです。良い点。
TheCompWiz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.