나는 "보장된" 또는 "최종" 의미에서 트랩을 사용하는 관용적 패턴을 찾고 있으므로 bash 함수가 어떻게 종료되는지에 관계없이 실행되어야 합니다.
함정을 찾았 RETURN
지만 중첩은 사소한 문제가 아닙니다. 나는 bar의 트랩이 foo의 트랩을 가리게 될 것이라고 생각합니다. foo
둘 다에 트랩을 설정하려면 어떻게 해야 합니까?bar
foo
따라서 다음 코드가 주어지면 종료 및 종료 시 정리 하고 싶습니다 bar
.
첫 번째 시도는 전역 문자열을 사용하여 정리 작업을 저장하는 것이었지만 하위 쉘이 있을 때마다 해당 문자열이 끊어졌습니다. 다음 코드의 출력에서 RETURN 신호도 "shell-global"인 것으로 나타납니다.
fooclear() { echo fooclear; }
barclear() { echo barclear; }
bar() {
echo bar
trap barclear RETURN INT ERR TERM EXIT
sleep 1
}
foo() {
echo foo
sleep 1
trap fooclear RETURN INT ERR TERM EXIT
bar
}
for i in 1 2 3; do
foo &
done
wait
한 가지 더 주의할 점: 중복 처리를 방지하려면 삭제 기능이 완료된 후 어떻게든 관리해야 합니다.
답변1
이 문서는 어디에서도 찾을 수 없지만 다음과 같이 추가된 것 같습니다.
trap - RETURN
트랩 핸들러의 마지막 명령이 되면 트랩이 이전 명령으로 되돌아가게 됩니다( 어딘가에 bash
여러 RETURN
핸들러를 남겨둡니다. 문서에는 일반적으로 trap - {SIGSPEC}
트랩이 기본값으로 되돌아가게 한다고 나와 있습니다. 이 경우 기본값은 "Shadow"인 것 같습니다) 트랩 명령.