programing

특정 명령에 대한 Bash 무시 오류

goodsources 2023. 5. 11. 21:24
반응형

특정 명령에 대한 Bash 무시 오류

다음 옵션을 사용하고 있습니다.

set -o pipefail
set -e

오류 발생 시 실행을 중지하는 bash 스크립트입니다.100줄에 이르는 스크립트를 실행하고 있으며 스크립트에 있는 모든 줄의 반환 코드를 확인하고 싶지 않습니다.

그러나 특정 명령에 대해서는 오류를 무시하고 싶습니다.내가 어떻게 그럴 수 있을까?

해결책:

particular_script || true

예:

$ cat /tmp/1.sh
particular_script()
{
    false
}

set -e

echo one
particular_script || true
echo two
particular_script
echo three

$ bash /tmp/1.sh
one
two

three인쇄되지 않습니다.

또한, 저는 그것을 덧붙이고 싶습니다.pipefailon인 경우, 파이프의 명령 중 하나가 0이 아닌 종료 코드를 가질 때 셸이 전체 파이프가 0이 아니라고 생각하기에 충분합니다(와 함께).pipefail마지막 하나여야 합니다.).

$ set -o pipefail
$ false | true ; echo $?
1
$ set +o pipefail
$ false | true ; echo $?
0

그냥 추가|| true명령 뒤에 오류를 무시합니다.

중지하지 않고 종료 상태 저장

특정 명령이 실패해도 스크립트가 중지되지 않고 실패한 명령의 오류 코드도 저장하려는 경우:

set -e
EXIT_CODE=0
command || EXIT_CODE=$?
echo $EXIT_CODE

좀 더 간결하게 설명하자면:

! particular_script

다음에 대한 POSIX 사양에서set -e(내꺼야):

이 옵션이 켜져 있을 때 단순 명령이 셸 오류의 결과에 나열된 이유 중 하나로 실패하거나 종료 상태 값 >0을 반환하고 시간, 만료 또는 if 키워드 뒤에 오는 복합 목록의 일부가 아니며 AND 또는 OR 목록의 일부가 아니며! 예약 단어 앞에 오는 파이프라인이 아닙니다.그러면 껍질은 즉시 빠져 나올 것입니다.

"returning true" 대신 "noop" 또는 null 유틸리티를 사용할 수도 있습니다(POSIX 사양 참조).:그냥 아무것도 하지 마당신은 몇 글자를 절약할 수 있을 것입니다.:)

#!/usr/bin/env bash
set -e
man nonexistentghing || :
echo "It's ok.."

위에서 제공하는 간단한 솔루션에 감사드립니다.

<particular_script/command> || true

스크립트 단계 및 추가 흐름 제어 옵션의 추가 작업/문제 해결에 다음 구성을 사용할 수 있습니다.

if <particular_script/command>
then
   echo "<particular_script/command> is fine!"
else
   echo "<particular_script/command> failed!"
   #exit 1
fi

우리는 추가적인 행동에 제동을 걸 수 있고,exit 1필요한 경우에는

이 문제를 해결할 다른 방법을 찾았습니다.

set +e
find "./csharp/Platform.$REPOSITORY_NAME/obj" -type f -iname "*.cs" -delete
find "./csharp/Platform.$REPOSITORY_NAME.Tests/obj" -type f -iname "*.cs" -delete
set -e

다음을 통해 오류 발생을 해제할 수 있습니다.set +e이제 해당 줄 이후의 모든 오류를 무시합니다.작업이 완료되고 오류가 발생할 경우 스크립트가 다시 실패하도록 하려면 다음을 사용할 수 있습니다.set -e.

신청 후set +efind파일을 찾을 수 없는 경우 더 이상 전체 스크립트를 실패하지 않습니다.동시에, 오류 메시지는find계속 인쇄되지만 전체 스크립트가 계속 실행됩니다.따라서 문제가 발생하면 디버깅하기가 쉽습니다.

이는 CI 및 CD에 유용합니다(예: GitHub Actions).

스크립트 실패를 방지하고 반환 코드를 수집하려면 다음을 수행합니다.

command () {
    return 1  # or 0 for success
}

set -e

command && returncode=$? || returncode=$?
echo $returncode

returncode명령의 성공 여부에 관계없이 수집됩니다.

output=$(*command* 2>&1) && exit_status=$? || exit_status=$?
echo $output
echo $exit_status

이를 사용하여 로그 파일 생성 예제

log_event(){
timestamp=$(date '+%D %T') #mm/dd/yy HH:MM:SS
echo -e "($timestamp) $event" >> "$log_file"
}

output=$(*command* 2>&1) && exit_status=$? || exit_status=$?

if [ "$exit_status" = 0 ]
    then
        event="$output"
        log_event
    else
        event="ERROR $output"
        log_event
fi

CLI 도구로 작업할 때 아래의 스니펫을 사용해 왔으며 리소스가 있는지 여부를 알고 싶지만 출력에는 관심이 없습니다.

if [ -z "$(cat no_exist 2>&1 >/dev/null)" ]; then
    echo "none exist actually exist!"
fi

하는 동안에|| true선호하는 것이지만, 당신은 또한 할 수 있습니다.

var=$(echo $(exit 1)) # it shouldn't fail

저는 이 솔루션이 마음에 듭니다.

: `particular_script`

뒤쪽 눈금 사이의 명령/스크립트가 실행되고 출력이 ":"("true"와 동일) 명령으로 공급됩니다.

$ false
$ echo $?
1
$ : `false`
$ echo $?
0

편집 : 못생긴 오타 수정

언급URL : https://stackoverflow.com/questions/11231937/bash-ignoring-error-for-a-particular-command

반응형