私にパイプがあるとしましょう。
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行目がエコーされるまでスクリプトが終了しないことを示します。