트랩 디버깅에 대한 질문

트랩 디버깅에 대한 질문

다음과 같은 스크립트가 있습니다.

function dbgtrap {
echo "badvar is $badvar" 
}

badvar=0

function some_func {
    badvar=1
    badvar=2
    badvar=3
}

set -o functrace

trap dbgtrap DEBUG
    some_func
trap - DEBUG    # turn off the DEBUG trap

스크립트를 얻은 후 출력을 얻었습니다.

badvar is 0
badvar is 0
badvar is 0
badvar is 1
badvar is 2
badvar is 3

나는 다음과 같은 것을 기대하고 있습니다 :

badvar is 0
badvar is 1
badvar is 2
badvar is 3

출력의 처음 두 줄은 어디에서 왔습니까?

답변1

일단 설정되면 모든 명령줄에서 트랩이 호출됩니다. 아래 그림과 같이 TRACE를 사용하여 출력합니다.

+ badvar=0
+ set -o functrace
+ trap dbgtrap DEBUG
++ dbgtrap
++ echo 'badvar is 0'
badvar is 0
+ some_func
++ dbgtrap
++ echo 'badvar is 0'
badvar is 0
++ dbgtrap
++ echo 'badvar is 0'
badvar is 0
+ badvar=1
++ dbgtrap
++ echo 'badvar is 1'
badvar is 1
+ badvar=2
++ dbgtrap
++ echo 'badvar is 2'
badvar is 2
+ badvar=3
++ dbgtrap
++ echo 'badvar is 3'
badvar is 3
+ trap - DEBUG

IIRC 쉘은 처리가 끝나면 트랩을 호출하므로 함수 호출이 badvar 값을 출력하기 전에 3줄의 출력이 있습니다.

관련 정보