터미널 명령에서 제목에 언급 된 것을 수행 할 수있는 방법이 있습니까, 아니면 코드를 조사해야합니까?
답변
주어진 터미널 명령의 종료 상태의 의미를 얻는 “레시피”는 없습니다.
내 첫 번째 시도는 맨 될 것이다 :
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를 나타냄).
보다:
- 부록 B. 고급 Bash 스크립팅 안내서의 특별한 의미의 종료 코드
- 더 나은 쉘 스크립트 작성 – Innovationsts의 2 부
답변
코드 / 문서를 조사해야합니다. 그러나 “표준화”에 가장 가까운 것은 errno.h입니다.
답변
내가 아는 한, stdlib.h
exit ()와 함께 사용하도록 정의 된 표준 값이 두 개뿐입니다 .
- EXIT_SUCCESS (= 0)
- EXIT_FAILURE (= 1)
사실상의 표준 값, 즉 세계의 모든 프로그램에 대해 동일한 의미를 갖는 유일한 표준 값은 0이며 이는 성공을 나타냅니다.
다른 프로그램은 다른 오류 (다른 유형 또는 심각도)를 구별하거나 강조하기 위해 반환 된 “실패”코드의 다른 목록을 소개합니다. 일부 프로그램은 반환 된 값을 사용하여 검색된 런타임 오류의 정수 (예 : 소송에서 실패한 단위 테스트 수)를보고하기도합니다.
나는 “새로운 표준”을 확장하는 것을 추천하지 않을 것이다. stdlib.h