문제가 발생할 때 트리거할 bash 스크립트에 대한 전역 트랩을 구현하고 싶습니다. 문제는 조건자인 함수를 평가하는 if 절이 있고 조건자를 평가하는 동안 오류가 발생하면 트랩이 호출되지 않는다는 것입니다. 조건자가 false를 반환하면 트랩이 호출되지 않는다는 것을 알고 있었지만 조건자를 평가하는 논리가 트랩도 비활성화할 것이라고는 예상하지 못했습니다. 행동에 대한 나의 설명이 정확합니까? bash가 술어를 논리적으로 평가하는 트랩을 호출하도록 하는 방법이 있습니까?
예를 들어,
$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1
여태까지는 그런대로 잘됐다. 트랩을 트리거하는 데 실패가 필요하고 모든 기능이 트랩을 상속하도록 요구하는 트랩을 정의했습니다. 그런 다음 bar
어느 것이 실패했는지 호출 foo
하고 트랩을 호출하고 오류 코드를 인쇄합니다 1
.
$ if bar; then echo true; fi
true
이것은 예상치 못한 일입니다. 출력은 1
. 반환 코드만 bar
고려 대상에서 제외될 것으로 예상됩니다. 내 생각에 실제로 일어나는 일은 거기에 bar
있는 모든 논리가반품고려 대상에서 제외됩니다. 이것이 bash가 작동하는 방식입니까? bar
마지막 문(예: 호출) 이전에 실패한 논리가 트랩을 트리거하도록 지정하는 방법이 있습니까 ?foo
return 0;