trap
샘플 코드를 사용하여 잘못된 명령이 반환 코드를 시도했습니다.
#!/bin/bash
# Exit on error
trap 'echo 'exiting..';exit' ERR
set -e
h=1
b=$((h+)) # <----- command causing the error
echo $?
echo $b
echo "end"
위반 지시가 있어도 트랩이 발생하도록 할 수는 없습니다. 하지만 서브셸에서 실행하면 같은 일이 발생합니다.
function junk() {
h=1
b=$((h+))
echo "Exit code:$?"
echo $b
echo "end"
echo "Hello"
}
junk
(또는) 서브셸에서 전체 명령을 실행합니다.
(h=1
b=$((h+))
echo "Exit code:$?"
echo $b
echo "end"
echo "Hello"
)
명령 실패를 포착하고 EXIT
트랩을 포착하여 그에 따라 메시지를 인쇄할 수 있습니다.
나는 사용하는 것을 안다set -e
-e errexit When set, the shell exits when a simple command in a command list exits
non-zero (FALSE). This is not done in situations, where the exit code is already checked
(if, while, until, ||, &&)
하지만 올바른 참조를 찾을 수 없습니다. 서브쉘이나 함수 또는 이와 유사한 것에서만 발생한다고 합니다.
여기서 기본적인 내용이 누락된 경우 알려주시기 바랍니다.
답변1
누락된 점은 sigspec set -e
과 sigspec이 모두 ERR
명령에 적용된다는 것입니다.구현하다(0이 아닌 값으로 종료되는 명령) 여기에 b=$((h+))
있는 것은분석하다실수. 명령은아니요이해되지 않았기 때문에 실행되었습니다.
함수나 서브쉘에서 작동하는 이유는 무엇입니까? 이 구문 분석 오류로 인해 포함된 스크립트(함수 또는 하위 쉘)가 전체적으로 실패하기 때문입니다. 즉, 이는 b=$((h+))
트랩을 트리거하지 않고(서브쉘에 트랩이 설정되지 않음) junk
서브쉘에 대한 호출 실패입니다.