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


17

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

답변:


15

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

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

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 종료 코드를 참조하십시오 .


그래, 어떤 사람, 정보, ... 페이지는 그것들을 포함하고 있습니다. 그리고 나는하지 않은 사람들에 대해 걱정했습니다. 웹 리서치는 항상 옵션이라는 것을 알고 있습니다. .. 지금은 내가 찾은 bash 종료 코드 일뿐입니다.
정확한

12

종료 코드는 프로그램을 종료 할 때 실패 조건을 나타내며 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 기반).

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

  • 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
    
  • 128-- 254치명적 오류 신호 "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 스크립트

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

    예:

    $ 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값은 시스템 API에 의해 사용되며, 종료 상태로 사용되지 않으며 (올바른 범위에 있지도 않음) 쉘 스크립팅과 관련이 없습니다. Sysexits 값은 sendmail에서 가져 왔으며 다른 어느 누구도 사용하지 않으며 표준에 가까운 것은 아닙니다.
Gilles 'SO- 악한 중지'

7

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


헤더 파일을 찾아 주셔서 감사합니다. 몇 가지 유틸리티의 문서를 보려고 시도했습니다. 종료 코드를 찾는 데 어려움을 겪었습니다. 대부분 stderrs가 될 것 같습니다 ...
정확한

3
errno.h종료 코드와 관련하여 오류 메시지 만 관련이 없습니다.
Gilles 'SO- 악의를 멈춰라'

대부분의 프로그램은 BSD 규칙에 따라 종료 코드를 반환 sysexits.h합니다. 그러나 일부 프로그램은을 반환 errno하며 실제로 errnos를 반환 하는 것이 가장 합리적 이라고 생각 합니다. 처리되지 않은 errnos는 예외와 같이 위쪽으로 전파됩니다 ( errno스테이, 함수 반환 -1또는 0|NULL). 별도의 주소 공간에서 실행되는 기능이기는하지만 프로그램은 기능에 불과하기 때문에 프로그램이 errno프로세스 경계를 ​​넘어 전파 를 계속하고 싶을 수도 있습니다 .
PSkocik

@PSkocik, 그런 명령의 예가 있습니까? errnos는 이식 가능하지 않으며 (시스템간에 값이 일치하지 않음), 값에서 err 이름 또는 메시지를 가져올 수있는 이식 가능한 방법이 없습니다 (zsh에는 내장되어 있음). 말할 것도없이 일부 시스템에는 일반적인 특수 오류 코드 와 충돌하는 123보다 큰 오류가 있습니다. 일반적으로 명령은 errno에서 메시지를 인쇄하고 성공 / 실패 종료 상태를 리턴합니다. 명령은 사용자를위한 것입니다. 함수 / 시스템 호출은 프로그래머를위한 것입니다.
Stéphane Chazelas

@ StéphaneChazelas 나는 그것을 몇 번 보았지만 잘 확립 된 프로그램에서는 인정하지 않아야합니다. 나는 최근에 장난감 시스템에서 개인적으로 errno + 1을 반환했습니다 (1은 계속 "모든 오류"를 의미합니다). 프로세스 경계를 ​​가로 질러 errno를 직렬화하는 것이 프로그램 실행이 BSD 규칙에 따라 변환하는 것보다 낫다고 생각하기 때문에 본질적으로 함수 호출이며 함수는 errno를 사용합니다. PROMPT_COMMAND (bash)에서 내 마지막 종료 상태 디코더를 사용하므로 다음과 같은 것을 얻습니다 "($numeric_code|$bsd_decoded|$errno_plus_one_decoded)".
PSkocik

1

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

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

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

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

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

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