함수 또는 하위 쉘 내에서 사용되지 않는 한 명령 종료 시 트래핑은 효과가 없습니다.

함수 또는 하위 쉘 내에서 사용되지 않는 한 명령 종료 시 트래핑은 효과가 없습니다.

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서브쉘에 대한 호출 실패입니다.

관련 정보