パイプを使用するときの2番目のコマンドの最初のコマンドから戻りコードを取得する

パイプを使用するときの2番目のコマンドの最初のコマンドから戻りコードを取得する

あるコマンドの出力と戻りコードを別のコマンドにパイプしたいと思います。

somecommand | anothercommand.sh

anothercommand.shはsomecommandの出力を読み取ることができますが、スクリプトは戻りコードをどのように読み込みますかsomecommand

$PIPESTATUSanotherstatus.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。 )

関連情報