나는 다시 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에서는 기능이 전혀 작동하지 않는 것 같습니다.