处理 bash 中的特定错误

处理 bash 中的特定错误

作为脚本的一部分,我想将包发布到 nuget feed:

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 上的回答

相关内容