Bashの特定のエラー処理

Bashの特定のエラー処理

スクリプトの一部としてパッケージをナゲットフィードに公開したいと思います。

dotnet nuget push package.1.2.3.nupkg --source "mysource" --api-key "mykey"

コマンドはerror: 409 already contains version 1.2.3コード1で印刷して終了できます。私の状況では完全に大丈夫ですが、スクリプト全体が失敗します。標準出力で特定のエラーが発生した場合はゼロ以外の終了コードを飲み込みますが、エラーが発生しない場合はゼロ以外の終了コードを表示するコマンドでこのコマンドをラップしたいと思います。タスクを完了するために何を使用できますか?

答え1

スクリプトは stdout と stderr をキャプチャし、終了コードが 0 の場合は stdout に再度印刷し、そうでない場合は stderr に印刷します。

文字列に「エラー:409バージョンがすでに含まれています」が含まれている場合、関数は0を返し、そうでない場合は元の終了コードが返されます。

#!/bin/bash

function do_nuget ()
{
        # save stdout and stderr
        out=$(dotnet nuget push "$1" --source "$2" --api-key "$3" 2>&1)
        exitcode=$?

        # if out is not empty...
        if [ -n "$out" ]; then
                if [ $exitcode -eq 0 ]; then
                        # echo to stdout
                        echo "$out"
                else
                        # echo to stderr
                        echo "$out" >&2
                fi
        fi
        if [ "$out" != "${out/error: 409 already contains version}" ]; then
                return 0
        fi
        return $exitcode
}
do_nuget "package.1.2.3.nupkg" "mysource" "mykey"
echo "got exit code: $?"

答え2

それよりも複雑なものをお探しですか?

emsg=$(your_command ... 2>&1) ||
    case $emsg in
    *"ignorable error condition"*) ;; # do nothing
    *) printf >&2 '%s\n' "$emsg"; exit 1 ;;
    esac

機能として:

# usage ignore pattern cmd [args ...]
ignore(){(
    pat=$1; shift; exec 3>&1
    emsg=$("$@" 2>&1 >&3 3>&-) || { e=$? &&
        case $emsg in
        $pat) ;; # ignore
        *) printf >&2 '%s\n' "$emsg"; exit "$e" ;;
        esac
    }
)}

error: 409 ..プログラムがメッセージを作成する場合は、追加のfdジャグリングを削除する必要があります。標準出力、標準エラーではありません。

答え3

|| trueスクリプトに追加できる行は次のとおりです。

dotnet nuget push package.1.2.3.nupkg --source "mysource" --api-key "mykey" || true

提案通りこれStackoverflowへの回答

関連情報