Bash 실행되지 않은 함수의 RETURN 트랩

Bash 실행되지 않은 함수의 RETURN 트랩

나는 다시 Bash의 함정에 빠져들기 시작했습니다. RETURN 트랩이 함수를 시작하지 않는다는 것을 방금 확인했습니다.

$ trap 'echo ok' RETURN
$ f () { echo ko; }
$ f
ko
$ . x
ok
$ cat x
$ 

보시다시피 예상대로 작동하여 빈 파일을 가져옵니다 x.

배쉬는 man다음과 같습니다:

sigspec이 RETURN이면 .shell 함수나 스크립트가 실행될 때마다 arg 명령이 실행됩니다. 또는 소스 내장 프로그램이 실행을 완료합니다.

그렇다면 내가 무엇을 놓치고 있는 걸까요?

나는 GNU bash 버전 4.4.12(1)-릴리스(x86_64-pc-linux-gnu)를 가지고 있습니다.

답변1

내가 아는 한, 내 질문의 문서 조각에는 예외가 있습니다. 스니펫은 다음과 같습니다.

sigspec이 RETURN이면 .shell 함수나 스크립트가 실행될 때마다 arg 명령이 실행됩니다. 또는 소스 내장 프로그램이 실행을 완료합니다.

예외 설명은 다음과 같습니다.

셸 실행 환경의 다른 모든 측면은 다음을 제외하고 함수와 호출자 간에 동일합니다.DEBUG 및 RETURN 트랩(아래 SHELL BUILTIN COMMANDS 아래 내장 트랩에 대한 설명을 참조하세요)Trace 속성(아래 내부 선언에 대한 설명 참조)이 지정되지 않거나 set 내장 함수를 사용하여 -o functrace 쉘 옵션이 활성화되지 않으면 함수는 상속되지 않습니다.(이 경우 모든 기능은 DEBUG 및 RETURN 트랩을 상속합니다.) -o errtrace 쉘 옵션이 활성화되지 않으면 ERR 트랩은 상속되지 않습니다.

의 경우 다음 을 사용하여 열 functrace수 있습니다 .typeset-t

-t는 각 이름에 추적 속성을 제공합니다. 추적 함수는 호출 셸에서 DEBUG 및 RETURN 트랩을 상속합니다. Trace 속성은 변수에 대해 특별한 의미가 없습니다.

트릭 도 있습니다 set -o functrace.

여기에 예가 있습니다.

$ trap 'echo ko' RETURN
$ f () { echo ok; }
$ cat y
f
$ . y
ok
ko
$ set -o functrace
$ . y
ok
ko
ko

의 경우 declare또 다른 -t옵션은 다음과 같습니다.

-t는 각 이름에 추적 속성을 제공합니다. 추적 함수는 호출 셸에서 DEBUG 및 RETURN 트랩을 상속합니다. Trace 속성은 변수에 대해 특별한 의미가 없습니다.

extdebug함수 추적 도 활성화할 수 있습니다.이카츄의 대답.

답변2

Bash 4.4에서는 활성화된 기능에서만 작동하는 것 같지만 extdebug문서에는 언급된 내용을 볼 수 없습니다.

$ cat ret.sh 
trap "echo ret" RETURN
foo() { echo "$1"; }
foo "without extdebug"
shopt -s extdebug
foo "with extdebug"

$ bash ret.sh
without extdebug
with extdebug
ret

$ bash --version |head -1
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)

Bash 4.3에서는 기능이 전혀 작동하지 않는 것 같습니다.

관련 정보