쉘 스크립트 종료 코드가 구별 가능한지 확인하십시오.

쉘 스크립트 종료 코드가 구별 가능한지 확인하십시오.

내부적으로 호출되는 두 개의 쉘 스크립트 a.sh및 가 있다고 가정해 보겠습니다 . 그런 다음 종료 코드 또는 종료 를 사용할 수 있다고 가정합니다 .b.sha.shb.shb.sh012

의 종료 코드가 a.sh의 종료 코드와 구별되도록 하기 위해 어떤 기술을 사용할 수 있습니까 b.sh? 예를 들어 a.sh종료 코드를 사용하여 종료할 수 있다고 결정한 경우 1호출자에게는 이것이 불분명합니다. 실패했습니까 a.sh, 아니면 b.sh실패했습니까? 이는 종료 코드를 사용해서는 안 된다는 것을 의미합니다 . a.sh그러나 선택할 수 있는 종료 코드의 수가 제한되어 있으며 이론적으로 발전함에 따라 추가 종료 코드가 얼마든지 추가될 수 있습니다.12b.sh

스크립트 사용자가 구별할 수 있도록 종료 코드와 함께 일부 추가 데이터를 전달하는 데 사용할 수 있는 기술이 있습니까?어느프로그램이 실제로 실패했나요? 아니면 스크립트 작성자로서 우리 스크립트가 블랙박스로 처리되고 사용자가 우리가 실행 중인 스크립트가 수행하는 개별 작업에 대한 통찰력을 가질 수 없다고 가정해야 합니까? 즉, 쉘 스크립트의 종료 코드는 가장 바깥쪽 스크립트의 결과로만 해석될 수 있습니까?

답변1

일반적으로 오류 메시지가 인쇄되고 잘못된 상태가 반환됩니다.

# a.sh
if ! b.sh foo bar; then
    echo >&2 "a.sh: b.sh failed"
    exit 1
fi
if something else; then
    echo >&2 "a.sh: some other error"
    exit 1
fi

그런 다음 다른 번호를 사용하여 사례를 구분하려는 경우 에서 그렇게 할 수 있습니다 a.sh. 원하는 경우 반환된 특정 오류를 확인 b.sh하고 이를 사용하여 에서 결정할 수도 있습니다 a.sh.

물론 더 긴 텍스트 식별자를 사용할 수 있도록 특정 형식으로 오류 메시지를 구성할 수도 있습니다.

후자가 전자를 호출한다는 사실도 구현 세부 사항이어야 하기 때문에 b.sh에서 직접 반환된 종료 상태를 반환하는 것이 타당하지 않다고 확신합니다 . a.shA의 전체 기능이 B를 감싸는 것이 아니라면 사용자는 A가 내부적으로 무엇을 하는지 신경 쓸 필요가 없습니다. 또한 처음에 다른 도구를 사용했던 도구는 나중에 수정되어 자체적으로 동일한 작업을 수행할 수 있습니다(더 잘 작동하는 경우). 또는 반대로 특정 작업을 자체적으로 수행하는 도구를 수정하여 다른 기존 도구를 활용할 수도 있습니다. 이렇게 하면 코드 중복이 줄어듭니다. 종료 값을 전달하면 이러한 내부 변경 사항이 직접 노출됩니다.

그럼에도 불구하고 호출자가 특정 종료 상태(일반적인 "성공/실패" 제외)가 무엇을 의미하는지 알고 싶다면 해당 특정 도구에 대해 기록해야 합니다.

그런 다음 더 큰 도구 라이브러리를 구축하는 경우 다양한 상황에 대한 공통 종료 값 시스템을 만들고 전체 라이브러리에 대해 해당 시스템을 문서화할 수 있습니다.

답변2

쿠사로난다의 리뷰:

종료 코드를 기록하는 것은 어떻습니까?

좋은 수익을 창출합니다. 그러나 b.sh종료 코드 쌍이 호출자에게 직접 표시되기를 원하거나 필요한 경우 a.sh종료 코드에 오프셋을 추가하는 것을 고려하십시오. b.sh예를 들어  b.sh2로 종료 하면 42(예: +40)로 종료 a.sh할 수 있습니다  .$?

관련 정보