실행 (exit 1);
은 ERR
트랩 을 트리거하는 가장 간단한 방법입니다 . 또한 set -e
유효한 경우 즉시 종료를 트리거합니다 . (오류 조건을 트리거하려면 명령이 실패해야합니다. exit
서브 쉘에 실패 값이 있으면 서브 쉘이 실패합니다.)
exit 1;
그런 일을하지 않을 것입니다.
따라서 디버깅 목적으로 유용한 트랩 {(exit 1); exit 1;}
을 먼저 생성 ERR
한 다음 오류 표시와 함께 스크립트를 종료하는 데 사용할 수 있습니다 .
그러나 그것은 autoconf
파일 에서 일어나고있는 것이 아닙니다 . autoconf
스크립트 EXIT
는 실행 중에 생성 된 임시 파일을 정리하기 위해 트랩에 의존 합니다. 를 포함한 대부분의 쉘 은 트랩을 호출하기 전에 명령에 bash
제공된 값에서 상태를 설정합니다 . 이를 통해 트랩이 오류 또는 정상 종료에서 호출되었는지 여부를 감지 할 수 있으며 트랩 조작 종료시 종료 상태가 올바르게 설정되었는지 확인할 수 있습니다.exit
EXIT
EXIT
그러나 분명히 일부 껍질은 협력하지 않습니다. autoconf
설명서 의 인용문은 다음과 같습니다 .
로 생성 된 스크립트와 같은 일부 쉘 스크립트는 autoconf
종료하기 전에 트랩을 사용하여 정리합니다. 마지막 쉘 명령이 0이 아닌 상태로 종료되면 트랩도 0이 아닌 상태로 종료되므로 호출자가 오류가 발생했음을 알 수 있습니다.
불행히도 Solaris와 같은 일부 셸에서 /bin/sh
종료 트랩은 종료 명령의 인수를 무시합니다. 이러한 쉘에서 트랩은 일반 종료 또는 종료 1에 의해 호출되었는지 여부를 판별 할 수 없습니다. 종료를 직접 호출하는 대신 AC_MSG_ERROR
이 문제점에 대한 임시 해결책이있는 매크로를 사용하십시오 .
해결 방법은 있는지 확인하는 것입니다 $?
종료 상태가 되기 전에exit
때 확실히 그 값을가집니다 그래서, 명령이 실행 된 EXIT
트랩이 실행됩니다. 그리고 실제로, AC_MSG_ERROR
호기심 많은 코드를 삽입하고 중복 괄호로 완성하는 것이 매크로입니다.
false
대신 대신 실행 하지(exit 1)
않습니까?