함수의 종료 후크를 캡처하고 싶습니다. Bash는 RETURN
함수가 반환될 때 호출되는 (POSIX가 아닌)이라는 멋진 신호를 제공합니다 .
function test_trap() {
trap 'echo trapped' RETURN
sleep 10 # simulate time-consuming commands
echo done
}
함수가 반환되면 "Trapped"가 표시됩니다.SIGINT
내가 메일을 보내도Ctrl
C
. Zsh에도 비슷한 기능이 있나요? Zsh에서 시도해 보았 EXIT
으나, Interrupt 를 사용할 때가 아닌 일반적인 반환값만 포착합니다 SIGINT
. 트랩도 해봤는데둘 다 EXIT
INT
동일한 후크 기능이 있지만 두 가지 문제가 있습니다 .
- 중단하면 후크 표현식이 두 번 평가됩니다. 별거 아닙니다. 내 후크 표현은 멱등성을 갖습니다.
- Zsh에 있는 것은
EXIT
기본입니다. 함수에서 반환되면 원래 후크가 복원됩니다. 이는 지역 변수가 전역 변수를 숨기는 방법과 유사합니다. 불행하게도INT
후크는 항상 전역이므로 내가 지정하는 모든 후크는 전역 후크를 재정의합니다. 원래INT
후크를 기억하고 나중에 복원해야 합니다. 이것을 올바르게 수행하는 것은 매우 까다롭습니다. 대신 이것을 시도해 볼 수도 있습니다.
답변1
이는 함수 외부의 EXIT 트랩과 같습니다. 그만두는 것과 죽임을 당하는 것은 서로 다른 문제입니다.
따라서 함수 외부와 마찬가지로 개별적으로 처리해야 합니다.
test_trap() {
set -o localoptions -o localtraps
trap 'echo "I am exiting."' EXIT
trap 'echo "I have been interrupted, so"; return 1' INT
echo start
sleep 10
echo end
}
test_trap
echo "returned with: $?"
이것은 만든다:
$ zsh ./that-script
start
^CI have been interrupted, so
I am exiting.
returned with: 1
네가 원한다면껍데기(함수뿐만이 아님) 함수 실행 중 핸들 SIGINT 신호를 받으면 종료하고, 신호를 통해 부모에게 사망을 보고하려면 으로 대체(또는 기본 핸들러( )를 복원한 후 SIGINT로 자살) return 1
로 exit
대체합니다 .trap - INT; kill -s INT "$$"