`{ { (exit 1); 은 무엇입니까? 1번 출구; }; }` 무슨 뜻인가요?

`{ { (exit 1); 은 무엇입니까? 1번 출구; }; }` 무슨 뜻인가요?

config.status에서 생성한 다음 코드 조각을 인용했습니다 configure.

if test ! -f "$as_myself"; then
{ { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
{ (exit 1); exit 1; }; }
fi

코드 조각에서는 무엇을 합니까 { (exit 1); exit 1; };? exit서브쉘에서만 수행하는 목적은 무엇입니까 ?

답변1

실행은 트랩 (exit 1);을 트리거하는 가장 간단한 방법입니다 ERR. 또한 set -e적용 중인 경우 즉시 종료됩니다 . (오류 조건을 트리거하려면 명령이 실패해야 합니다. exit서브셸에 실패 값이 있으면 서브셸이 실패하게 됩니다.)

exit 1;그 중 어느 것도 하지 않을 것입니다.

따라서 디버깅 목적에 유용한 작업을 수행할 수 있는 트랩을 먼저 생성한 다음 오류 표시와 함께 스크립트를 종료하는 {(exit 1); exit 1;}데 사용할 수 있습니다 .ERR

autoconf그러나 그것은 파일 에서 일어나는 일이 아닙니다 . 스크립트는 실행 중에 생성된 임시 파일을 정리하기 위해 트랩 autoconf에 의존합니다 . EXIT포함한 대부분의 쉘은 트랩을 호출하기 전에 명령 bash에 제공된 값으로 상태를 설정합니다 . 이를 통해 트랩은 오류 또는 정상적인 종료에서 호출되었는지 여부를 감지할 수 있으며 트랩 작업이 끝날 때 종료 상태가 올바르게 설정되었는지 확인할 수도 있습니다.exitEXITEXIT

그러나 분명히 일부 포탄은 협력하지 않습니다. 다음은autoconf수동:

에서 생성된 것과 같은 일부 셸 스크립트는 autoconf트랩을 사용하여 종료하기 전에 정리합니다. 마지막 쉘 명령이 0이 아닌 상태로 종료된 경우 호출자가 오류가 발생했음을 알 수 있도록 트랩도 0이 아닌 상태로 종료됩니다.

불행하게도 Solaris와 같은 일부 쉘에서는 /bin/sh종료 트랩이 종료 명령의 인수를 무시합니다. 이러한 셸에서 트랩은 일반 종료에 의해 호출되었는지 또는 종료 1에 의해 호출되었는지 확인할 수 없습니다. 출구를 직접 호출하는 대신 AC_MSG_ERROR이 문제에 대한 해결 방법이 있는 매크로를 사용하십시오.

$?해결 방법은 종료 상태가 있는지 확인하는 것입니다.~ 전에명령 exit이 실행되므로 트랩이 EXIT실행될 때 확실히 해당 값을 갖게 됩니다. 그리고 실제로 AC_MSG_ERROR중복된 중괄호로 완성된 이상한 코드를 삽입하는 것은 매크로 입니다 .

답변2

내가 보기에는 이것에 대한 목적이 없으며, 서브쉘을 시작한 다음 즉시 종료함으로써 직접적으로 달성할 수 있는 것은 없습니다.

이와 같은 것은 자동 생성 코드의 부작용일 가능성이 높습니다. 어떤 경우에는 해당 하위 쉘에서 실행되는 다른 명령이 있을 수 있습니다 exit 1. 궁극적으로 어떤 경우에는 기능이 없는 일부 명령문을 삽입하도록 허용하여 생성 코드를 어떻게든 단순화하고 매번 '깨끗한 코드'를 생성하는 것이 더 복잡할 가능성이 높습니다. 그 중 하나 또는 위의 코드를 생성한 코드가 제대로 작성되지 않았습니다. :)

의 자유로운 사용은 {...}이것의 또 다른 예입니다. 대부분은 중복되지만 구별하는 것보다 모든 경우에 삽입하는 코드를 작성하는 것이 더 쉽습니다(어쩌면 블록의 출력/입력을 리디렉션하려는 경우도 있음). 필요하지 않은 것들은 생략합니다.

답변3

(exit 1)이는 특정 종료 코드를 얻는 간단하고 아마도 가장 간단한 방법일 것입니다(물론 1의 특별한 경우에는 더 쉬운 방법이 있습니다). 그러나 이 경우에는 종료 코드가 검사되지 않기 때문에 이것이 이유가 아닙니다.

서브셸을 넣는 목적은 exit스크립트를 종료하지 않는 것일 수 있습니다(특정 종료 코드 생성을 위해 종료를 사용하더라도).

관련 정보