bash で while ループは子プロセスになっているらしい

コマンド hogehoge は存在しないので exit 1 で終了されることを期待していたのですが
ループは抜けるものの最終列の exit 0が実行されてしまいます。

#! /bin/bash -xv

cat << END > sku_table_list
m_jan_base
m_jan_kaigai
END

cat sku_table_list |
while read a
do
 hogehoge
 [ $(echo ${PIPESTATUS[@]} | tr " " "+" | bc) -eq 0 ] || exit 1
done

exit 0

「||」は左辺のコマンドが失敗したら右辺のコマンドが実行されるという書き方
〇〇 || exit は ○○が失敗したときに exit 1が実行されるということ
「&&」にすると左辺のコマンドが成功したときに右辺のコマンドが実行される
「$(echo ${PIPESTATUS[@]} | tr " " "+" | bc)」はパイプで結合したすべてのコマンドのリターンコードの合計をしている

tr で各コマンドの実行結果の区切り文字' ' を '+' に変更して足し算にして
bc で式を実行している。全部成功していたら0


達人に聞いたところ ループの中は子プロセスになるので
ループを抜けたところで再度チェックすればよいとのこと

これが正解

#! /bin/bash -xv

cat << END > sku_table_list
m_jan_base
m_jan_kaigai
END

cat sku_table_list |
while read a
do
 hogehoge
 [ $(echo ${PIPESTATUS[@]} | tr " " "+" | bc) -eq 0 ] || exit 1
done
[ $? -eq 0 ] || exit 1 ← ここ追加する

exit 0