논리 검사에 관계없이 bash 함수 내부를 주장하는 방법은 무엇입니까?

논리 검사에 관계없이 bash 함수 내부를 주장하는 방법은 무엇입니까?

나는 무엇이든 실패할 때 실행되는 bash 스크립트에 대한 전역 트랩을 구현하고 싶습니다. 문제는 술어인 함수를 평가하는 if 절이 있고 해당 술어를 평가하는 동안 오류가 있는 경우 트랩이 호출되지 않는다는 것입니다. 조건자가 false를 반환하면 트랩이 호출되지 않는다는 것을 이해하지만 조건자를 계산하는 논리에서 트랩도 비활성화될 것이라고는 예상하지 못했습니다. 동작에 대한 나의 해석이 정확합니까? 어쨌든 bash가 술어를 계산하는 논리에서 트랩을 호출하도록 할 수 있습니까?

예를 들어,

$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1

여태까지는 그런대로 잘됐다. 나는 트랩을 정의하고, 모든 실패가 트랩을 트리거하도록 요청하고, 모든 함수가 트랩을 상속하도록 요청합니다. 그런 다음 실패한 bar호출을 호출 하고 트랩을 호출하고 오류 코드를 인쇄합니다 .foo1

$ if bar; then echo true; fi
true

이것은 예상치 못한 일입니다. 나는 출력이 1. 반환 코드만 bar고려 대상에서 제외될 것으로 예상했습니다. 실제로 일어나는 일은 내부의 모든 논리가 다음과 같다는 것입니다 bar.또한고려 대상에서 제외됩니다. 그게 bash가 작동하는 방식인가요? 마지막 문( 예 : )이 트랩을 트리거하기 전에 실패한 논리 bar(예: 에 대한 호출 )를 지정하는 방법이 있습니까?fooreturn 0;

관련 정보