답변:
환경에 따라 다르지만 스타일이 좋지 않다고 말하고 싶습니다.
유닉스 계열 시스템은 종료 상태가 0이면 성공을 나타내고 0이 아닌 종료 상태는 실패를 나타내는 강력한 규칙을 가지고 있습니다. 전부는 아니지만 일부 프로그램은 0이 아닌 종료 코드가 다른 여러 종류의 실패를 구분합니다. 예를 들어 grep
, 패턴이 발견되면 일반적으로 0을, 패턴이 없으면 1, 누락 된 파일과 같은 오류가있는 경우 2 이상을 리턴합니다.
이 컨벤션은 유닉스 쉘에 거의 연결되어 있지 않습니다. 예를 들어,에서 sh
, bash
및 기타 본쉘의 if
문 취급 성공 / 참으로 0 종료 상태, 실패 / 거짓으로 0이 아닌 종료 상태 :
if your-command
then
echo ok
else
echo FAILURE
fi
MS Windows의 규칙은 비슷하다고 생각합니다.
이제 중지 아무것도 용도 틀에 얽매이지 않는 종료 코드는, 아무것도 다른, 그것과 상호 작용하는,하지만 당신은 잘 확립 된 규칙을 위반하고 있다는 인식 될 것없고, 특히 경우에 그 자신의 프로그램을 작성에서 확실히 없다 할 수 돌아와서 나중에 물어 .
프로그램이 이런 종류의 정보를 반환하는 일반적인 방법은 다음과 같이 인쇄하는 것입니다 stdout
.
status = $(your-command)
echo Result is $status
grep
, diff
반환 1 차이가 발견되면, 오류가 발생한 경우> 1입니다.
환경에 따라 다릅니다.
Wikipedia에서 나는 wierdness를 가장 좋아합니다 .
OpenVMS에서 성공은 홀수 값으로, 실패는 짝수 값으로 표시됩니다. 값은 제어 비트, 기능 번호, 메시지 번호 및 심각도와 같은 하위 필드가있는 32 비트 정수입니다. 심각도 값은 성공 (성공, 정보) 및 실패 (경고, 오류, 치명적)로 구분됩니다.
출구 코드가 의미 있고 관련 정보를 호출자에게 반환하고 성공의 정의가 실제로 이진이 아니라면 선례가 있다고 생각합니다. 내가 생각하는 선례는 일어났던 것에 따라 많은 다른 것들을 돌려주는 robocopy입니다 .
나는 우리가 항상 이것 때문에 디버깅을해야한다고 덧붙일 것입니다. 대부분의 유틸리티는 종료 코드 0 == 성공을 가정하므로 robocopy는 1을 반환 할 때 놀라게됩니다. 오류도 발생하지 않습니다.
용인 될 수 있다고 생각되는 사례를 알고 있습니다. 총 테스트 실패 횟수로 종료되는 테스트 프레임 워크를 알고 있습니다. 예를 들어 테스트 러너가 실패한 테스트없이 완료되면 0으로 종료됩니다. 하나의 테스트가 실패하면 테스트 러너 자체가 제대로 실행 되었더라도 1로 종료됩니다. 두 개가 실패하면 2 등을 반환합니다. 이것은 250까지 올라갑니다. 이는 "250 개 이상의 테스트 실패"를 의미합니다.
종료 코드> 250을 사용하여 비정상 종료를 나타냅니다.
이것이 관습을 위반하지만 실제로는 잘 작동합니다.
좋은 예 : man sa-update (spamassassin)
출구 코드
이 경우 엑시트 1은 정보 코드입니다. 그러나 코드를 작성했으면 일반적으로 주 전원 오류가 발생하므로 1을 선택하지 않았을 것입니다.
set -e
어딘가에 놓으면 대부분의 쉘 스크립트를 깨뜨릴 것 입니다.