배쉬 트랩 오류 $BASH_COMMAND

배쉬 트랩 오류 $BASH_COMMAND

트랩을 2개 만들었어요

trap function1 DEBUG
trap pwd ERR
function function1 {
echo $BASH_COMMAND
}

잘못된 명령을 사용하면 a출력은 ->입니다.

a
bash: a: command not found
a
/home/user/dir

그런 다음 두 번째로 DEBUG를 호출하여 실행하는데 pwd$BASH_COMMAND가 여전히 a인 이유는 무엇입니까? 명령이 실행될 때 function1의 함수 호출이 이루어졌는지 알 수 있는 방법이 있습니까 trap ERR?

편집하다

함정은 두 개다.

trap -- 'f' DEBUG
trap -- 's' ERR
function f 
{ 
    echo "inside function f command is $BASH_COMMAND"
}
function s 
{ 
    echo "inside function s command is $BASH_COMMAND"
}

잘못된 명령의 출력은 a다음과 같습니다.

inside function f command is a
bash: a: command not found
inside function f command is a
inside function s command is echo "inside function s command is $BASH_COMMAND"

두 번째는 inside function f command is aERR 트랩에서 나와야 합니다.

답변1

bash이에 대한 내용은 문서(귀하의 문서 참조)에서 찾을 수 있으며 man bash여러 곳에 설명되어 있습니다 trap.

BASH_COMMAND 현재 실행 중이거나 곧 실행될 명령입니다. 단, 쉘이 트랩의 결과로 명령을 실행하는 경우는 트랩 시 실행된 명령입니다.

그리고

및 트랩 [...]은 함수에 [...] 속성이 지정되지 않았거나 내장 함수 설정을 사용하여 쉘 옵션이 활성화되지 않은 한 상속되지 않습니다(이 경우 모든 함수는 상속 DEBUG및 트랩됩니다).RETURNtrace-o functraceDEBUGRETURN

명령을 약간 수정하면 trap더 명확하게 볼 수 있습니다.

trap 'echo "##DEBUG## $BASH_COMMAND"' DEBUG
trap 'echo "##ERR## $PWD"' ERR

a
##DEBUG## a
-bash: a: command not found
##DEBUG## a
##ERR## /home/roaima

그리고

f() { printf "%s..." "We are in function f()"; sleep 1; printf " OK\n";  }
f
##DEBUG## f
We are in function f()... OK

관련 정보