특정 명령에 대한 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
인쇄되지 않습니다.
또한, 저는 그것을 덧붙이고 싶습니다.pipefail
on인 경우, 파이프의 명령 중 하나가 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
이 옵션이 켜져 있을 때 단순 명령이 셸 오류의 결과에 나열된 이유 중 하나로 실패하거나 종료 상태 값 >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 +e
그find
파일을 찾을 수 없는 경우 더 이상 전체 스크립트를 실패하지 않습니다.동시에, 오류 메시지는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
'programing' 카테고리의 다른 글
날짜 시간 x 시리즈에 대한 탁월한 그림 (0) | 2023.05.11 |
---|---|
작업의 용도는 무엇입니까?C#의 결과로부터 (0) | 2023.05.11 |
NameError: 글로벌 이름 'unicode'가 정의되지 않았습니다(Python 3). (0) | 2023.05.11 |
제약 조건이 0의 높이를 모호하게 제시하는 경우를 감지함 (0) | 2023.05.11 |
WPF란 무엇이며 WinForms와 비교하면 어떻습니까? (0) | 2023.05.11 |