パイプラインの1つのステップで失敗した場合にパイプラインをすぐに失敗させる方法

パイプラインの1つのステップで失敗した場合にパイプラインをすぐに失敗させる方法

私にパイプがあるとしましょう。

reader | processor | writer

デフォルトでは、パイプはリーダーが最良のシナリオprocessorからwriterプロセッサにデータを送信しようとした後にのみ失敗するようです。

どのステップでも失敗した場合は、パイプライン全体がすぐに失敗する必要があります。set -eo pipefail役に立ちません。

醜い回避策なしでこれは可能ですか?それは自然なことであり、可能なことのようです。

私は例を挙げた。

==> script <==
#! /usr/bin/env bash

set -eo pipefail

trap "exit 1" ERR

./read | ./process | ./write

==> read <==
#! /usr/bin/env bash

seq 10 |
    while read line; do
        >&2 echo echoing $line
        echo $line
        sleep 2
    done

==> process <==

count=0
while read line; do
    echo processing $line
    count=$((count+1))
    if [[ $count == 1 ]]; then
        >&2 echo exiting...
        exit 1
    fi
done

==> write <==
#! /usr/bin/env bash

while read line; do
    echo $line
done

これを実行すると

echoing 1
exiting...
processing 1
echoing 2

これは、2行目がエコーされるまでスクリプトが終了しないことを示します。

関連情報