종료 코드 (및 / 또는 리턴 코드) 목록과 명령 / 유틸리티에 대한 의미는 어떻게 얻습니까? 할 수있는 방법이

터미널 명령에서 제목에 언급 된 것을 수행 할 수있는 방법이 있습니까, 아니면 코드를 조사해야합니까?



답변

주어진 터미널 명령의 종료 상태의 의미를 얻는 “레시피”는 없습니다.

첫 번째 시도는 맨 될 것이다 :

user@host:~# man ls
   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).

둘째 : 구글 . 예를 들어 wget 을 참조하십시오 .

Third : 쉘의 종료 상태 (예 : bash) Bash와 빌트인은 특별히 125 이상의 값을 사용할 수 있습니다. 127 명령을 찾을 수 없으며 126 명령을 실행할 수 없습니다. 자세한 정보는 bash 종료 코드를 참조하십시오 .


답변

종료 코드는 프로그램을 종료 할 때 실패 조건을 나타내며 0과 255 사이입니다. 쉘과 내장은 특히 125보다 큰 값을 사용하여 특정 실패 모드를 표시 할 수 있으므로 코드 목록은 쉘과 운영 체제 (예 : Bash)마다 다를 수 있습니다 종료 상태로 128 + N 값을 사용합니다). 참조 : 배쉬 – 3.7.5 종료 상태 또는 man bash.

일반적으로 종료 상태 가 0 이면 명령이 성공 했음을 나타내고 , 0이 아닌 종료 상태는 실패를 나타냅니다 .

명령이 리턴 한 오류 코드를 확인 $?하기 위해 마지막 종료 코드를 인쇄 하거나 쉘 스크립트 종료 후 파이프 라인 (배시) ${PIPESTATUS[@]}에서 종료 상태 값 목록을 제공 할 수 있습니다 .

찾을 수있는 모든 종료 코드의 전체 목록은 없지만 커널 소스에서 종료 상태 번호를 체계화하려는 시도가 있었지만 이는 C / C ++ 프로그래머를위한 것이며 스크립팅에 대한 유사한 표준이 적합 할 수 있습니다.

프로그램 (64-78)에 대한 바람직한 종료 코드가있는 Linux 및 BSD / OS X의 일부 sysexits 목록은 다음에서 찾을 수 있습니다 /usr/include/sysexits.h(또는 man sysexitsBSD에서).

0   /* successful termination */
64  /* base value for error messages */
64  /* command line usage error */
65  /* data format error */
66  /* cannot open input */
67  /* addressee unknown */
68  /* host name unknown */
69  /* service unavailable */
70  /* internal software error */
71  /* system error (e.g., can't fork) */
72  /* critical OS file missing */
73  /* can't create (user) output file */
74  /* input/output error */
75  /* temp failure; user is invited to retry */
76  /* remote error in protocol */
77  /* permission denied */
78  /* configuration error */
/* maximum listed value */

위의 목록은 64-78에서 이전에 사용되지 않은 종료 코드를 할당합니다. 할당되지 않은 종료 코드의 범위는 향후 더 제한 될 것입니다.

그러나 위의 값은 주로 sendmail에 사용되며 다른 사람은 거의 사용하지 않으므로 표준에 가까운 원격 거리가 아닙니다 ( @Gilles가 지적한 것처럼 ).

셸에서 종료 상태는 다음과 같습니다 (Bash 기반).

  • 1125명령이 완료되지 않았습니다. 명령의 맨 페이지에서 상태의 의미를 확인하십시오 (아래 몇 가지 예).

  • 1 -일반적인 오류에 대한 Catchall

    “0으로 나누기”및 기타 허용되지 않는 작업과 같은 기타 오류

    예:

    $ let "var1 = 1/0"; echo $?
    -bash: let: var1 = 1/0: division by 0 (error token is "0")
    1
    
  • 2 -셸 내장 오용 (Bash 설명서에 따름)

    키워드 또는 명령이 없거나 권한 문제 (이진 파일 비교에 실패한 경우 diff 리턴 코드)

    예:

     empty_function() {}
    
  • 6 -그러한 장치 또는 주소가 없습니다

    예:

    $ curl foo; echo $?
    curl: (6) Could not resolve host: foo
    6
    
  • 124 -명령 시간 초과

  • 125-명령 자체가 실패하면 coreutils를 참조하십시오.
  • 126 -명령이 있지만 호출 할 수없는 경우 (예 : 실행 불가능)

    권한 문제 또는 명령은 실행 파일이 아닙니다.

    예:

    $ /dev/null
    $ /etc/hosts; echo $?
    -bash: /etc/hosts: Permission denied
    126
    
  • 127 -명령을 찾을 수 없으면 명령을 실행하기 위해 작성된 하위 프로세스가 해당 상태를 리턴합니다.

    $PATH오타 가 있거나 문제가있을 수 있습니다 .

    예:

    $ foo; echo $?
    -bash: foo: command not found
    127
    
  • 128 -잘못된 인수 exit

    exit는 0-255 범위의 정수 인수 만 사용합니다.

    예:

    $ exit 3.14159
    -bash: exit: 3.14159: numeric argument required
    
  • 128254치명적 오류 신호 “n”-신호 수신으로 인해 명령이 사망했습니다. 신호 코드는 128 (128 + SIGNAL)에 추가되어 상태 (Linux : man 7 signal, BSD 🙂 를 가져옵니다 ( man signal아래 몇 가지 예).

  • 130 -Ctrl-C를 눌러 명령이 종료되었습니다. 130-128 = 2 (SIGINT)

    예:

    $ cat
    ^C
    $ echo $?
    130
    
  • 137-명령이 KILL(9)신호 (128 + 9) 로 전송되면 명령 의 종료 상태

    kill -9 $PPID 스크립트

  • 141SIGPIPE리더가없는 파이프에 쓰기

    예:

    $ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
    $ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
    xargs: cat: terminated by signal 13
    $ echo ${PIPESTATUS[@]}
    0 125 141
    
  • 143 -신호 코드 15로 명령이 종료 됨 (128 + 15 = 143)

    예:

    $ sleep 5 && killall sleep &
    [1] 19891
    $ sleep 100; echo $?
    Terminated: 15
    143
    
  • 255*-종료 상태가 범위를 벗어났습니다.

    exit는 0-255 범위의 정수 인수 만 사용합니다.

    예:

    $ sh -c 'exit 3.14159'; echo $?
    sh: line 0: exit: 3.14159: numeric argument required
    255
    

위 표에 따르면, 종료 코드 1-2, 126-165 및 255는 특별한 의미를 가지므로 사용자 지정 종료 매개 변수에는 사용하지 않아야합니다.

범위를 벗어난 종료 값으로 인해 예상치 못한 종료 코드가 발생할 수 있습니다 (예 : 종료 3809는 종료 코드 225, 3809 % 256 = 225를 나타냄).

보다:


답변

코드 / 문서를 조사해야합니다. 그러나 “표준화”에 가장 가까운 것은 errno.h입니다.


답변

내가 아는 한, stdlib.hexit ()와 함께 사용하도록 정의 된 표준 값이 두 개뿐입니다 .

  • EXIT_SUCCESS (= 0)
  • EXIT_FAILURE (= 1)

사실상의 표준 값, 즉 세계의 모든 프로그램에 대해 동일한 의미를 갖는 유일한 표준 값은 0이며 이는 성공을 나타냅니다.

다른 프로그램은 다른 오류 (다른 유형 또는 심각도)를 구별하거나 강조하기 위해 반환 된 “실패”코드의 다른 목록을 소개합니다. 일부 프로그램은 반환 된 값을 사용하여 검색된 런타임 오류의 정수 (예 : 소송에서 실패한 단위 테스트 수)를보고하기도합니다.

나는 “새로운 표준”을 확장하는 것을 추천하지 않을 것이다. stdlib.h


답변