스크립트의 일부로 패키지를 너겟 피드에 게시하고 싶습니다.
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에 대한 답변