Bash의 특정 오류 처리

Bash의 특정 오류 처리

스크립트의 일부로 패키지를 너겟 피드에 게시하고 싶습니다.

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

명령은 error: 409 already contains version 1.2.3코드 1로 인쇄하고 종료할 수 있습니다. 내 상황에서는 완벽하게 괜찮지만 전체 스크립트가 실패하게 됩니다. 표준 출력에서 ​​특정 오류가 발생하면 0이 아닌 종료 코드를 삼키지만 오류가 발생하지 않으면 0이 아닌 종료 코드를 표시하는 명령으로 이 명령을 래핑하고 싶습니다. 작업을 완료하기 위해 무엇을 사용할 수 있나요?

답변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에 대한 답변

관련 정보