쉘 스크립팅에서 예외 처리?
쉘 스크립트에서 예외 처리 메커니즘을 찾고 있습니다. 쉘 스크립트에 try, catch 동등한 메커니즘이 있습니까?
실제로 try/catchin bash 는 없지만 (bash를 사용하고 있다고 가정합니다) &&또는 사용하여 매우 유사한 동작을 얻을 수 있습니다 ||.
이 예에서는 실패fallback_command 할 경우 실행하려고 a_command 합니다 (0이 아닌 값 반환).
a_command || fallback_command
이 예에서는 성공second_command 하면 실행하려고합니다 (0 반환).a_command
a_command && second_command
그들은 쉽게 예를 들어, 다음 명령이 실행됩니다, 서브 쉘을 사용하여 혼합 함께이 될 수 있습니다 a_command그것은 다음 실행 성공하면, other_command하지만 경우 a_command또는 other_command, 실패 fallback_command실행됩니다 :
(a_command && other_command) || fallback_command
if / else 구조 및 종료 코드는 일부를 위조하는 데 도움이 될 수 있습니다. 이것은 Bash 또는 Bourne (sh)에서 작동합니다.
if foo ; then
else
e=$? # return code from if
if [ "${e}" -eq "1"]; then
echo "Foo returned exit code 1"
elif [ "${e}" -gt "1"]; then
echo "Foo returned BAD exit code ${e}"
fi
fi
{
# command which may fail and give an error
} || {
# command which should be run instead of the above failing command
}
다음은 bash에서 이벤트 처리를 활성화하는 두 가지 간단한 bash 함수입니다 .
다음과 같이 기본적인 예외 처리에 사용할 수 있습니다.
onFoo(){
echo "onFoo() called width arg $1!"
}
foo(){
[[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg"
}
addListener EXCEPTION_FOO_OCCURED onFoo
try / catch 블록을 사용한 예외 처리는 bash에서 지원되지 않지만이를 지원하는 BANGSH 프레임 워크를 살펴보고 싶을 수 있습니다 (bash의 jquery와 약간 비슷 함).
그러나 , 시도 / 캐치 블록을 계단식없이 exceptionhandling하는 것은 유사하다 eventhandling , 입니다 거의 가능한 모든 배열을 지원하는 언어입니다.
코드를 멋지고 깔끔하게 유지하려면 (if / else 자세한 정보없이) 이벤트를 사용하는 것이 좋습니다.
MatToufoutu가 권장하는 제안 (|| 및 && 사용)은 함수에는 권장되지 않지만 간단한 명령 에는 좋습니다 . ( 위험에 대한 BashPitfalls 참조 )
error_exit가 하나의 인수를받는 함수 인 경우 다음을 사용하여 오류를 올바르게 처리합니다. 인수가 전달되지 않으면 실제로 오류가 발생하는 LineNo와 함께 알 수없는 오류가 발생합니다. 실제로 생산에 사용하기 전에 실험하십시오-
#!/bin/bash
PROGNAME=$(basename $0)
error_exit()
{
echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
exit 1
}
echo "Example of error with line number and message"
error_exit "$LINENO: An error has occurred."
참고 URL : https://stackoverflow.com/questions/6961389/exception-handling-in-shell-scripting
'Program Club' 카테고리의 다른 글
| std :: strstream이 더 이상 사용되지 않는 이유는 무엇입니까? (0) | 2020.11.04 |
|---|---|
| 저장 프로 시저에 선택적 OUTPUT 매개 변수를 사용할 수 있습니까? (0) | 2020.11.04 |
| JavaScript를 사용하여 HTML에서 자식 노드를 제거하려면 어떻게해야합니까? (0) | 2020.11.03 |
| Visual Studio C ++에서 타사 DLL 파일을 어떻게 사용합니까? (0) | 2020.11.03 |
| Android logcat 데이터를 파일에 쓰기 (0) | 2020.11.03 |