2017-11-17 12 views
0

は、私が(代わりにファイルにそれを置くの)bashスクリプト内で、送信メールクライアントssmtpのメールテキストを生成しようとしています。私はこの思い付いたheredocの使用バッシュ - 変数展開とヒアドキュメント、保存改行

[email protected] 
[email protected] 
SUBJ="$HOSTNAME: Daemon not running" 

read -d '' msg <<EOF 
    To: $MAILTO 
    From: $FROM 
    Subject: $SUBJ 

    Please check $HOSTNAME. 
    Daemon has stopped running. 

    -Admin 
EOF 

echo $msg | ssmtp $MAILTO 

を(。テキストは改行を保存しないので、これは動作しませんssmtpは、メールを送信しません。)

Iの場合echo $msg 、私はheredocの改行が保存されていないことを確認します。どうすればそれを達成できますか?また

:どこに違いところでこの

{ 
    echo "To: $MAILTO" 
    echo "From: $FROM" 
    echo "Subject: $SUBJ" 
    echo 
    echo "Please check $HOSTNAME" 
} | ssmtp $MAILTO 

と最初の例はありますか?すべてechoコマンドが実行され、結果がssmtpにパイプされていますか?これは私の最初の例では機能しませんか? echoテキストとパイプechoのコマンドへの出力はできませんか?

+1

使用すると、 'エコー "の$ MSG" 引用' – anubhava

答えて

1

まず、あなたはこのためreadは必要ありません。

msg="\ 
To: $MAILTO 
From: $FROM 
Subject: $SUBJ 

Please check $HOSTNAME. 
Daemon has stopped running. 

-Admin" 

第二に、あなたは常に引用パラメータ展開すべきです。そうしたときにあなたが望むものではないことがわかるでしょう。そのようなケースはまれです。

echo "$msg" | ssmtp "$MAILTO" 

最後に、あなたかどうかを検討必要msgを最初の場所で:

ssmtp "$MAILTO" <<EOF 
To: $MAILTO 
From: $FROM 
Subject: $SUBJ 

Please check $HOSTNAME. 
Daemon has stopped running. 

-Admin 
EOF 
+0

私はあなたの2番目の例が好きです。私が欠けているのは、これを関数でインデントする能力です。 - あるいは '-EOF'を使うとインデントできますか? – Ugur

+0

実際の生のスクリプトでは、さまざまなデータを使ってスクリプトのどこかに大量の電子メールテキストを生成し、それを 'ssmtp'を介してメールを送る関数に渡すので、' msg'を取得する必要がありました。 – Ugur

+1

あなたはタブで*だけ*インデントすることができます。先頭のタブだけが取り除かれ、周囲のコードのインデントに合わせるのが難しくなります。 – chepner

1

あなたの第二の例は、Command Groupingを使用しています。だからあなたの仮定は、すべてのechoのコマンドが実行され、ssmtpに配管されていることが正しいです。マニュアルから

:中括弧の間のコマンドのリストを置く

リストは、現在のシェルのコンテキストで実行させます。サブシェルは作成されません。あなたの最初の例については

。これはヘレドックのせいではない。引用符でmsgを囲むようにしてください:

echo "$msg" | ssmtp "$MAILTO" 
+0

はあなたの詳細な説明をいただき、ありがとうございます。 - コマンドグループの結果をコマンドにパイプするのではなく、変数に代入する方法はありますか?これは、関数内でグループ化されたコマンドをインデントし、コードを整列させる可能性があるためです(読みやすさのために)。 – Ugur

+0

'OUTPUT = $ {expression} ' – Ugur

+0

で動作する必要があります。しかしこれは: 'msg = $(echo" Peter "; echo; echo" Pan ")'ですが、改行は挿入されません。うーん...バッシュについてたくさん学ぶ必要がある:) – Ugur

関連する問題