스크립트의 종료 코드가 반환된 값과 다르게 보이는 이유는 무엇입니까?

스크립트의 종료 코드가 반환된 값과 다르게 보이는 이유는 무엇입니까?

다른 스크립트(create-docker-container.sh)를 호출하는 스크립트(run-docker-container.sh)가 있습니다. create-docker-container는 docker 원격 API에 대해 컬 스크립트를 실행하고 http 코드를 반환하거나 성공하면 0을 반환합니다. 따라서 생성 스크립트는 다음을 반환합니다.

echo $RVAL
exit $RVAL

내 테스트에서 $RVAL의 값은 404이며, 이 값이 이 질문에 관심이 있는 값입니다.

내 run-docker-container 스크립트에는 다음 줄이 있습니다.

create-docker-container.sh $CONTAINER_NAME $CONTAINER_SETTINGS
rval=$?
echo $rval
if [ $rval -eq 404 ]; then
    ...
fi

create가 404로 종료되는 것처럼 보이지만 내가 얻은 값 $?은 148이므로 조건부 처리가 호출되지 않습니다. 왜 이런 일이 발생하며 스크립트에서 종료 코드를 올바르게 가져오는 방법은 무엇입니까?

답변1

역사적인 이유로 프로세스의 종료 상태는 8자리 숫자입니다. 전달하는 숫자는 exit모듈로 256(2⁸)으로 줄어듭니다.

또한 126 이상의 값은 시작에 실패한 프로그램(126 또는 127) 또는 신호(128 이상)에 의해 종료된 프로그램을 나타내는 일반적인 의미를 갖습니다. 따라서 이러한 값을 반환할 수 있지만 이러한 조건을 시뮬레이션하려는 경우가 아니면 해당 값을 반환하면 안 됩니다.

규칙은 성공 시 0을 반환하고 오류를 나타내려면 다른 값을 반환하는 것입니다. 조건부 명령(예: ifwhile), 오류 시 중단되는 도구(예: set -e아래의 쉘 스크립트 및 makefiles 등) 등 많은 도구가 0을 성공으로 해석하기 때문에 이는 규칙입니다 .

오류와 관련하여 가장 일반적인 규칙은 오류가 있으면 1을 반환하고 오류가 있으면 2를 반환하는 것입니다. 세 번째로 가장 일반적인 규칙은 실패가 예상되는 경우(예: 검색 명령에서 아무것도 찾지 못함) 1을 반환하고, 실패가 예상치 못한 경우(예: 검색 중인 파일이 존재하지 않는 경우) 2를 반환하는 것입니다. HTTP 오류 코드를 종료 상태에 매핑해야 하는 경우 1-125 범위(200이 0에 성공적으로 매핑됨)를 사용할 수 있지만 이에 대한 표준은 없습니다.

관련 정보