あるコマンドの出力と戻りコードを別のコマンドにパイプしたいと思います。
somecommand | anothercommand.sh
anothercommand.shはsomecommandの出力を読み取ることができますが、スクリプトは戻りコードをどのように読み込みますかsomecommand
?
$PIPESTATUS
anotherstatus.shには、以前のコマンドに関する情報はありません(予想される内容です)。
答え1
{ somecommand; echo "STATUS:${?}"; } | anothercommand.sh
パイプラインの最後のデータ行に状態を送信します。したがって、前のデータをすべて読み込むまで使用できません。状態は悪い場合にのみ送信される可能性があるため、「キャンセル」演算子として機能します。
パイプ内のデータの順序が重要でない場合は、最初にtac
状態が出るようにデータを最初に挿入するか、メモリにすべてバッファリングするか(おそらくawk配列で)、Stephenが提案したようにファイルを使用できます。容量。
成功した後にのみデータを生成すると、somecommand
とにかく間違ったステータス行が最初に(それ自体で)表示されます。実際、「成功」は「私が期待したデータを得ましたか?」で測定できることが多いです。
stderrを2>&1
パイプデータにリダイレクトし、エラーメッセージを見つけることもできます(有効なデータと簡単に区別できる場合)。
答え2
パイプラインのコマンドは並列に実行できるため、パイプラインではこれを実行できません。anothercommand.sh
起動時にsomecommand
まだ完了しておらず、終了コードが不明です。
この情報が必要な場合は、パイプラインを分割して実行をシリアル化する必要があります。
somecommand > tmpfile
anothercommand.sh $? < tmpfile
(適切な建設でtmpfile
、例えば使用mktemp
。 )