클린 종료를위한 0이 아닌 종료 상태


15

문제의 프로그램이 제대로 실행 된 경우 0이 아닌 종료 코드를 반환해도됩니까? 예를 들어 다음을 수행하는 간단한 프로그램이 있다고 가정 해보십시오.

프로그램은 N 개의 인수를 취합니다. 종료 코드 min (N, 255)을 반환합니다. N은 프로그램에 유효합니다.

보다 현실적인 프로그램은 다른 것을 의미하는 성공적으로 실행 된 프로그램에 대해 다른 코드를 반환 할 수 있습니다. 이러한 프로그램이 대신 stdout과 같이이 정보를 스트림에 대신 써야합니까?

답변:


24

환경에 따라 다르지만 스타일이 좋지 않다고 말하고 싶습니다.

유닉스 계열 시스템은 종료 상태가 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

7
관습을 설명하기 위해 +1, 그 접근법은 내가 set -e어딘가에 놓으면 대부분의 쉘 스크립트를 깨뜨릴 것 입니다.
Benjamin Bannier 2016 년

이와 유사합니다 grep, diff반환 1 차이가 발견되면, 오류가 발생한 경우> 1입니다.
7heo.tk

6

환경에 따라 다릅니다.

Wikipedia에서 나는 wierdness를 가장 좋아합니다 .

OpenVMS에서 성공은 홀수 값으로, 실패는 짝수 값으로 표시됩니다. 값은 제어 비트, 기능 번호, 메시지 번호 및 심각도와 같은 하위 필드가있는 32 비트 정수입니다. 심각도 값은 성공 (성공, 정보) 및 실패 (경고, 오류, 치명적)로 구분됩니다.


4

출구 코드가 의미 있고 관련 정보를 호출자에게 반환하고 성공의 정의가 실제로 이진이 아니라면 선례가 있다고 생각합니다. 내가 생각하는 선례는 일어났던 것에 따라 많은 다른 것들을 돌려주는 robocopy입니다 .

나는 우리가 항상 이것 때문에 디버깅을해야한다고 덧붙일 것입니다. 대부분의 유틸리티는 종료 코드 0 == 성공을 가정하므로 robocopy는 1을 반환 할 때 놀라게됩니다. 오류도 발생하지 않습니다.


2

성공적인 실행을 위해 0을 반환하지 않는 것은 나쁜 생각입니다. 프로그램을 실행하는 사람들에게 혼란을 줄 수 있기 때문입니다. 일부가 다른 입력으로 프로그램을 100 번 이상 실행하고 실패 또는 완료 한 횟수를 알고 싶을 때 단일 성공 값을 사용하면 다른 값을 갖는 것보다 차이점을 훨씬 쉽게 찾을 수 있습니다.

서로 다른 것을 의미 할 수있는 여러 개의 성공적인 리턴 경로를 가진 프로그램이 있다면, 이는 프로그램이 제대로 설계되지 않았다는 표시입니다.


2

용인 될 수 있다고 생각되는 사례를 알고 있습니다. 총 테스트 실패 횟수로 종료되는 테스트 프레임 워크를 알고 있습니다. 예를 들어 테스트 러너가 실패한 테스트없이 완료되면 0으로 종료됩니다. 하나의 테스트가 실패하면 테스트 러너 자체가 제대로 실행 되었더라도 1로 종료됩니다. 두 개가 실패하면 2 등을 반환합니다. 이것은 250까지 올라갑니다. 이는 "250 개 이상의 테스트 실패"를 의미합니다.

종료 코드> 250을 사용하여 비정상 종료를 나타냅니다.

이것이 관습을 위반하지만 실제로는 잘 작동합니다.


3
나는이 생각하지 않는 규칙을 위반 - 오류가없는 경우 테스트가 성공; 0이 아닌 결과 코드는 테스트 실패를 나타냅니다.
Bevan

1
"0보다 많은 오류를 나타 내기 위해 오류 상태로 종료하는 중"이며 종료 상태의 정확한 공통 의미를 위반할 수 있지만 더 큰 "0은 괜찮습니다. 0보다 큰 것은 오류입니다"규칙을 위반하지 않습니다. .
Vatine

2

실제로 코드와 함께 전달하려는 내용에 따라 다릅니다. 예를 들어, DB2는 예를 들어, 데이터를 찾을 수없는 경우 100을, 경고에 대한 다양한 기타 양수 값, 오류에 대해서는 음수 값을 리턴합니다. 오라클은 비슷한 일을합니다.

따라서 다른 성공 상태가있는 경우 다양한 반환 값을 사용하는 것이 좋습니다.


2

좋은 예 : man sa-update (spamassassin)

출구 코드

  • 종료 코드 0은 업데이트를 사용할 수 있음을 의미하며 --checkonly가 지정되지 않은 경우 다운로드되어 성공적으로 설치되었습니다.
  • 종료 코드 1은 새로운 업데이트가 없었 음을 의미합니다.
  • 종료 코드 2는 다음을 의미합니다.

이 경우 엑시트 1은 정보 코드입니다. 그러나 코드를 작성했으면 일반적으로 주 전원 오류가 발생하므로 1을 선택하지 않았을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.