bashでは、一連のコマンドからread
を使用して環境変数を設定し、パイプをサブプロセスに設定できます。しかし、私は1つのエッジケースでの処理でエラーを検出することに問題があります。サブプロセスパイプラインの一部がエラーの前に出力を生成しています。bashのread文で失敗したサブプロセスを検出するにはどうすればよいですか?
、入力ファイルを受け取り「FOO」で始まる行を探し、その行の最初の単語にvar
を設定する簡単な例である:
blah
zap foo awesome
bang foo
等
data.txt
でこれを実行
set -e
set -o pipefail
set -o nounset
die() {
echo $1 > /dev/stderr
exit 1
}
read -r var rest < <(\
cat data.txt \
| grep foo \
|| die "PIPELINE" \
) || die "OUTER"
echo "var=$var"
これを実行する
意志出力
var=zap
予想通り(stderrに)foo
出力が含まれていないdata.txt
ファイル
DEAD: PIPELINE
DEAD: OUTER
にこれがすべてです。
我々は、プロセス
...
read -r var rest < <(\
cat data.txt \
| grep foo \
| cat \
|| die "PIPELINE" \
) || die "OUTER"
...
の終わりにcat
のように別のノーオペレーション段階を導入することができ、すべてが動作するように続けています。
しかし、追加のステージがpaste -s -d' '
であり、入力は出力がパイプラインエラーことを示しているようだ
var=
DEAD: PIPELINE
である「foo」を含むが、読んでいない場合は、空の行に成功します。 (paste -s -d' '
は、入力が空であっても出力行を出力するようです。)
パイプラインのこの障害を検出してメインスクリプトをエラーにする簡単な方法はありますか?
は、私は、変数が空でないことを確認することができると思います - しかし、これは簡易版である - 私は実際に
read -r v1 v2 v3 rest < <(\
cat data.txt \
| grep "^foo=" \
| sed -e 's/foo=//' \
| paste -s -d' ' \
|| die "PIPELINE"
) || die "OUTER"