답변:
주어진 터미널 명령의 종료 상태의 의미를 얻는 "레시피"는 없습니다.
내 첫 번째 시도는 맨 될 것이다 :
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 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에 사용되며 다른 사람은 거의 사용하지 않으므로 표준에 가까운 원격 거리가 아닙니다 ( @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에서 가져 왔으며 다른 어느 누구도 사용하지 않으며 표준에 가까운 것은 아닙니다.
코드 / 문서를 조사해야합니다. 그러나 "표준화"에 가장 가까운 것은 errno.h입니다.
errno.h
종료 코드와 관련하여 오류 메시지 만 관련이 없습니다.
sysexits.h
합니다. 그러나 일부 프로그램은을 반환 errno
하며 실제로 errno
s를 반환 하는 것이 가장 합리적 이라고 생각 합니다. 처리되지 않은 errno
s는 예외와 같이 위쪽으로 전파됩니다 ( errno
스테이, 함수 반환 -1
또는 0|NULL
). 별도의 주소 공간에서 실행되는 기능이기는하지만 프로그램은 기능에 불과하기 때문에 프로그램이 errno
프로세스 경계를 넘어 전파 를 계속하고 싶을 수도 있습니다 .
"($numeric_code|$bsd_decoded|$errno_plus_one_decoded)"
.
내가 아는 한, stdlib.h
exit ()와 함께 사용하도록 정의 된 표준 값이 두 개뿐입니다 .
사실상의 표준 값, 즉 세계의 모든 프로그램에 대해 동일한 의미를 갖는 유일한 표준 값은 0이며 이는 성공을 나타냅니다.
다른 프로그램은 다른 오류 (다른 유형 또는 심각도)를 구별하거나 강조하기 위해 반환 된 "실패"코드의 다른 목록을 소개합니다. 일부 프로그램은 반환 된 값을 사용하여 검색된 런타임 오류의 정수 (예 : 소송에서 실패한 단위 테스트 수)를보고하기도합니다.
나는 "새로운 표준"을 확장하는 것을 추천하지 않을 것이다. stdlib.h