|| を使用して条件付きコマンドを実行すると、以前に失敗したコマンドからエラー・メッセージを取得できますか?

|| を使用して条件付きコマンドを実行すると、以前に失敗したコマンドからエラー・メッセージを取得できますか?

ヘルパー機能があります。

function error_exit
{
    /opt/aws/bin/cfn-signal ...
    exit 1
}

このヘルパー関数はエラーを通知するために使用されます。使用例は次のとおりです。

/opt/aws/bin/cfn-init -s .. || error_exit 'Failed to run cfn-init'

このcfn-initコマンドには問題に関連しない多くのパラメーターが必要です。コマンドがnull以外の値を返し、エラー出力にエラーメッセージが表示される場合は、エラーメッセージを取得してerror_exitメソッドにパラメータとして含めたいと思います。可能ですか?そうでなければ、ソースエラーメッセージを取得するためにbashでヘルパーメソッドをどのように実装しますか?

答え1

エラー出力をファイルにリダイレクトしてから、その出力を取得できます。

trap "rm -f /tmp/cfn-error.txt" 0 1 2 3 15
/opt/aws/bin/cfn-init -s ... 2>/tmp/cfn-error.txt ||
    error_exit $(</tmp/cfn-error.txt)

常に乱雑な部分をクリーンアップする必要があるので、作成した一時ファイルをすべて削除することを忘れないでください。

答え2

リダイレクトを通じてこれを行うこともできます。

# run_cmd 'error message' cmd -foo "${params[@]}"
run_cmd() {
    local e r m=$1
    shift
    exec 6>&1
    e=$("$@" 2>&1 >&6)
    r=$?
    exec 6>&-
    ((r)) || return 0
    error_exit "$m" "$e"
}

したがって、次を使用します。

run_cmd 'Failed to run cfn-init' /opt/aws/bin/cfn-init -s ..

e=$("$@" 2>&1 >&6) 行は最初に stderr を stdout に指示し、$(..) コンテキストで我々がキャプチャする出力です。その後、stdoutは、関数を起動したときに元の位置に移動されます。

もちろん、error_exitを追加の終了ステータスを取得し、次のように呼び出すことができます。error_exit "$ m" "$ r" "$ e"

関連情報