2017-11-08 9 views
3

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" 

答えて

0

を私は、コンテキストに応じて、2つの異なるソリューションと一緒に行きました。

最初は、結果を一時ファイルにパイプすることでした。これにより、読み取りを実行する前にファイル全体が処理されるため、パイプに障害が発生するとスクリプトが失敗します。

cat data.txt \ 
    | grep "^foo=" \ 
    | sed -e 's/foo=//' \ 
    | paste -s -d' ' \ 
    > $TMP/result.txt 
    || die "PIPELINE" 

read -r var rest < $TMP/result.txt || die "OUTER" 

第2は、変数が設定されたことをテストすることでした。これは を意味していましたが、私が避けたかった重複がありました。

read -r var rest < <(cat data.txt \ 
    | grep "^foo=" \ 
    | sed -e 's/foo=//' \ 
    | paste -s -d' ' \ 
    || die "PIPELINE" 
    ) || die "OUTER" 

[ ! -z "$var" ] || die "VARIABLE NOT SET" 
1

あなたのように、複数の変数を設定するために複数行に参加するsedpasteを使用していますpasteの出力が何か含まれているかどうかを確認するために、別のgrepを使用することができます。最終的には

read -r var rest < <(\ 
    cat data.txt \ 
    | grep foo \ 
    | paste -s -d' ' \ 
    | grep . \ 
    || die "PIPELINE" \ 
) || die "OUTER" 
関連する問題