BashでSIGPIPEを抑制する方法は?

BashでSIGPIPEを抑制する方法は?

次のコードを実行しようとしています。

set -euxo pipefail
yes phrase | make installer

Makefile標準入力を使用してインストーラphraseファイルを作成します。ただし、このコマンドはCIビルドを中断するエラーコード141で終わります。この例は、次のように単純化できます。

yes | tee >(echo yo)

ここで見ることができます:出力をティーに配管するときのパイプ障害(141) - なぜですか?- このエラーは、パイプ消費者が出力消費を中断したことを意味します。私の場合はまったく問題ありません。

パイプエラーを抑制し、それから戻りコードのみを取得する方法はありますかmake installer

ベストアンサー1

141 終了コードは、プロセスが失敗したことを示し、SIGPIPEこれはyesパイプが閉じたときに発生します。 CI に対してこのエラーをマスクするには、次のようなものを使用してエラーをマスクする必要があります。

(yes phrase ||:) | make installer

すると実行されyes phrase、失敗した場合は:コード 0 で実行して終了します。yes書けない以外に失敗する理由があまりないので、この方法は十分に安全です。

このタイプのパイプライン問題をデバッグするための最良の方法は、次の点を調べることですPIPESTATUS

yes phrase | make installer || echo "${PIPESTATUS[@]}"

これにより、失敗時にパイプラインのすべての部分の終了コードが表示されます。終了コード141で失敗した場合は、適切に処理できます。特定のエラーコードの一般的な処理パターンは次のとおりです。

(command; ec=$?; if [ "$ec" -eq 141 ]; then exit 0; else exit "$ec"; fi)

(ありがとうございます。ハウクラグ);command成功するとコード 0 で実行され終了しcommand、成功するとコード 141 で終了します。他の終了コードはそのまま反映されます。

おすすめ記事