成功した場合は、パイプされたコマンドの結果を割り当てます。

成功した場合は、パイプされたコマンドの結果を割り当てます。

コマンドが失敗しなかった場合にのみ、aコマンド結果の最初の単語を私の変数に割り当てたいと思います。func <some_arg>失敗した場合は文書化する必要があります。

これまで私がしたことは次のとおりです。

func() {
    if [[ $1 -eq 1 ]]
    then
        echo 'hello world'
        return 0
    fi

    echo 'Something wrong has happened!' >> path/to/dev.log
    return 2
}

a=$(func 1)
r=$?

if [[ $r -eq 0 ]]
then
    a=$(awk '{ print $1 }' <<<"$a")
fi

これは間違いなく機能しますが、変数を2回割り当てるのは好きではありませんa

私はこれを試しました:

  a=$(func 2 | awk '{ print $1 }') || echo 'Something wrong has happened!' >> path/to/dev.log

しかし、何も記録しません

もっと良い方法がありますか?

ベストアンサー1

set -o pipefail以下を使用して、パイプラインの前の部分でエラーを取得できます。

パイプの戻り状態は、最後のコマンドの終了状態です。パイプ故障オプションが有効です。もしパイプ故障有効にすると、パイプの戻り状態は、ゼロ以外の状態で終了した最後の(最も右側の)コマンドの値、またはすべてのコマンドが正常に終了した場合は0です。

$ foo() { [[ "$1" = 1 ]] || return 1; echo "hello world"; }
$ a=$(set -o pipefail; foo 2 | awk '{print $1}' || echo "fail..." >&2)
fail...

しかし、実際にはなぜ2回割り当てることが問題になるのか理解できません。デフォルトでは、コマンドが成功すると取得した値を変更し、コマンドが失敗した場合は無視します。

あるいは、そのロジックを少し圧縮することもできます。

if a=$(foo 1); then
   a=${a%% *};
   echo "first word of a is '$a'"; 
   # do some work with $a...
else
   echo "error..." >&2;
fi

印刷

first word of a is 'hello'

おすすめ記事