배쉬 트랩(RETURN 트랩)에 빠지다

배쉬 트랩(RETURN 트랩)에 빠지다

나는 "보장된" 또는 "최종" 의미에서 트랩을 사용하는 관용적 패턴을 찾고 있으므로 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"인 것 같습니다) 트랩 명령.

답변2

맞습니다. RETURN 신호는 모든 신호와 마찬가지로 쉘 전역입니다. 어떤 신호라도 잡아바꾸다해당 신호에 설정된 모든 트랩은 아마도 "그림자"가 의미하는 것일 것입니다.

트랩은 몇 가지 간단한 예외 처리를 제공하지만 더 강력한 기능을 위해 이 스택오버플로 질문에 대한 답을 확인하겠습니다.잡으려고 노력하다

관련 정보