web-dev-qa-db-ja.com

前のコマンドのstdoutputの前に何かを追加するbash pipeコンストラクト

Sendmailを使って私にものを送って、ワンライナーでやりたいです。

echo "mail content" | sendmail emailataddres.com 

件名なしで送信します。

件名はメールコンテンツの前にある必要があるため、次のような内容を探しています。

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

sedとawkは使いにくく、覚えにくい傾向があります。

[〜#〜] edit [〜#〜]:明確にする必要があります:エコー "メールコンテンツ"は単なる例です。どのソースからのストリームもstdoutストリームに追加できるようにする必要があります。例:ifconfig、zcatなど。

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

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

45
Claudius

これはクラウディウスの回答に触発されました。

出力の間に改行を入れたくない場合は、_-n_パラメータを追加します。これは次のようになります。

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

それは与えるでしょう:

_21_

6
VenomFangs

クラウディウスの発言を使用するか、独自に作成してください。

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

私が集めたものから...あなたはこのようなことをすることができます:

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
TheCompWiz

プロセス置換 を使用して、パイプで連結された出力の前に付加できます。

$ echo "mail content" | cat <(echo "Subject: All that matters") -
Subject: All that matters
mail content
0
aparkerlue