종료 코드(및/또는 반환 코드) 목록과 명령/유틸리티의 의미를 어떻게 얻을 수 있습니까?

종료 코드(및/또는 반환 코드) 목록과 명령/유틸리티의 의미를 어떻게 얻을 수 있습니까?

터미널 명령을 통해 제목에 명시된 작업을 수행할 수 있는 방법이 있습니까? 아니면 코드를 봐야 합니까?

답변1

종료 코드는 프로그램 종료의 성공 또는 실패를 나타냅니다. 범위는 0에서 255입니다. 쉘과 그 내장 기능은 특정 실패 모드를 나타내기 위해 구체적으로 125 이상의 값을 사용할 수 있으므로 코드 목록은 쉘과 운영 체제마다 다를 수 있습니다(예를 들어 Bash는 128+ 값을 사용합니다)질소종료 상태로). 바라보다:Bash - 3.7.5 종료 상태또는 man bash.

일반적으로 말하면,0종료 상태는 명령을 나타냅니다.성공적인, 그리고 0이 아닌종료 상태 표시실패하다.

명령이 어떤 오류 코드를 반환하는지 확인하려면 $?마지막 종료 코드를 인쇄하거나 ${PIPESTATUS[@]} 종료 상태 값 목록을 제공하면  됩니다.관로(Bash에서) 쉘 스크립트가 종료된 후.

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

/usr/include/sysexits.hLinux 및 BSD/OS X의 일부 sysexit 목록과 프로그램에 대한 기본 종료 코드(64-78)는 다음 위치 man sysexits(또는 BSD)에서 찾을 수 있습니다.

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에서 사용되며 다른 곳에서는 거의 사용되지 않으므로 표준과는 거리가 멀다(지적한 바와 같이)자일스).

셸에서 종료 상태 값은 다음과 같습니다(Bash 기준).

  • 1- 125- 명령이 성공적으로 완료되지 않았습니다. 상태가 무엇을 의미하는지 알아보려면 명령의 매뉴얼 페이지를 확인하세요. 다음은 몇 가지 예입니다.

  • 1- 흔히 발생하는 실수를 모두 잡아보세요

    "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- 명령 자체가 실패한 경우(참조:핵심 도구)

  • 126- 명령을 찾았지만 호출할 수 없는 경우(예: 실행할 수 없는 경우)

    권한 문제가 있거나 명령을 실행할 수 없습니다.

    예:

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

    $PATH질문 이나 오타가 있을 수 있습니다 .

    예:

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

    종료는 0 - 255 범위의 정수 인수만 허용합니다.

    예:

      $ exit 3.14159
      -bash: exit: 3.14159: numeric argument required
    
  • 128- 254- 치명적인 오류 신호 'n' - 신호 수신으로 인해 명령이 종료되었습니다. 상태(Linux: man 7 signal, BSD: man signal)를 얻으려면 128(128 + 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* - 종료 상태가 범위를 벗어났습니다.

    종료는 0 - 255 범위의 정수 인수만 허용합니다.

    예:

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

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

범위를 벗어난 종료 값은 예상치 못한 종료 코드가 발생할 수 있다는 점에 유의하세요(예: exit 38093809% 256 = 225이므로 종료 코드 225가 제공됨).

바라보다:

답변2

주어진 터미널 명령의 종료 상태의 의미를 얻는 "비밀"은 없습니다.

내 거첫 번째이 맨페이지를 사용해 보십시오:

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).

두번째:Google. 바라보다얻다예를 들어.

제삼: bash와 같은 셸의 종료 상태입니다. Bash와 내장 기능은 구체적으로 125 이상의 값을 사용할 수 있습니다. 127은 명령을 찾을 수 없음을 의미하고, 126은 명령을 실행할 수 없음을 의미합니다. 자세한 내용은 다음을 참조하세요.배시 종료 코드.

답변3

코드/문서를 살펴봐야 합니다. 그러나 "표준화"에 가장 가까운 것은오류 번호

답변4

내가 아는 한, 대략 두 가지 표준 값만 있습니다. 둘 다 stdlib.hexit()와 함께 사용하도록 정의됩니다.

  • 종료_성공(=0)
  • 종료_실패(=1)

세상의 모든 프로그램에 대해 동일한 의미를 갖는 유일한 사실상의 표준 값은 성공을 나타내는 0(영)입니다.

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

나는 확장하기 위해 어떠한 종류의 "새로운 표준"도 도입하는 것을 권장하지 않습니다.stdlib.h

관련 정보