あるプロセスから別のプロセスに出力をパイプするにはどうすればよいですか?ただし、最初のプロセスに出力がある場合にのみ実行しますか?

あるプロセスから別のプロセスに出力をパイプするにはどうすればよいですか?ただし、最初のプロセスに出力がある場合にのみ実行しますか?

出力がある場合は、電子メールを送信するようにこのコマンドをどのように書き換えることができますかmailq | grep

mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email

一行で可能でしょうか?

バラよりパイプが空であることを確認し、空の場合は、データに対してコマンドを実行します。メールを送信するよりも一般的なケースです。

ベストアンサー1

&&grepが次の一致があることを示す終了ステータスを返す場合にのみ、演算子を使用してメールコマンドを実行できるようにするには、一時ファイルを使用する必要があると思います。

TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"

一時ファイルがどこかに残っていても大丈夫で静的名を使用できる場合は、特別な命名と削除操作をスキップできます。

 mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep

編集する:見た後グレンの答え私はもう少し遊ん$()で構文を使用して変数を割り当てると、コマンドの終了コードが返されるので、文字列の長さのテストをスキップして使用できます。これはすべて1つのコマンドで行われます。

data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"

編集2:見た後サイモンの答え私は私のmailプログラムを確認しました。彼が説明したデフォルト値と同じようには機能しませんが、オプションがあります。マニュアルページから:

-E送信メッセージの最初または唯一のメッセージ部分にテキストが含まれていない場合は、送信されずに自動的に削除され、プログラムの起動時に Skipemptybody 変数が効果的に設定されます。これは、cron(8)によって開始されたスクリプトからメッセージを送信するのに役立ちます。

これを可能にしなさい:

mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email

おすすめ記事