`{ { (1번출구); 무슨 뜻인가요? 1번 출구 }` 무슨 뜻인가요?

`{ { (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에 의해 호출되었는지 여부를 확인할 수 없습니다. Exit를 직접 호출하는 대신 AC_MSG_ERROR이 문제를 해결하는 매크로를 사용하십시오.

해결책은 $?종료 상태가 있는지 확인하는 것입니다.앞으로명령 exit이 실행되므로 EXIT트랩이 실행될 때 확실히 해당 값을 갖게 됩니다. 사실, AC_MSG_ERROR추가 중괄호와 함께 이상한 코드를 삽입하는 것은 이 매크로입니다.

답변2

내가 아는 한, 이 작업을 수행할 목적은 없으며, 서브셸을 시작한 다음 즉시 종료해도 직접적으로 얻을 수 있는 것은 없습니다.

이와 같은 일은 자동 생성된 코드의 부작용일 가능성이 높습니다. 어떤 경우에는 하위 쉘에서 실행되는 다른 명령이 있을 수도 있습니다 exit 1. 궁극적으로 생성된 코드는 경우에 따라 기능이 없는 일부 명령문을 생성된 코드에 삽입하도록 허용함으로써 어느 정도 단순화될 가능성이 높으며, 매번 "깨끗한 코드"를 생성하는 것이 더 복잡해집니다. 또는 위의 코드를 생성하는 코드가 제대로 작성되지 않았습니다. :)

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

답변3

(exit 1)이는 특정 종료 코드를 얻는 간단하고 아마도 가장 간단한 방법일 것입니다(물론 1의 특별한 경우에는 더 간단한 방법이 있습니다). 하지만 이 경우에는 종료 코드가 확인되지 않으므로 그렇지 않습니다.

서브쉘을 넣는 목적은 exit스크립트를 종료하지 않는 것일 수 있습니다(exit는 특정 종료 코드를 생성하는 데 사용되지만).

관련 정보