ex.로 착각하지 않도록 우리가 사용할 수 있는 반환 값이 무엇인지 알고 싶습니다. 신호 지능?
전임자. :
$sleep 10
$#hit ctrl+c
$echo $?
130
그래서 나는 다음과 같은 것을 사용할 수 없다는 것을 압니다 return 130
.exit 130
따라서 이것은 오해의 소지가 있습니다.
$function FUNC(){ return 130; };FUNC;echo $?
130
답변1
프로세스의 종료 상태는 값으로 인코딩됩니다.0에서 255 사이, 이것이 종료 코드로 사용할 수 있는 전부입니다. 이 범위 밖의 값을 전달하면 대부분의 쉘은 나머지 모듈로 256을 사용합니다. 일부 쉘에서는 함수가 더 넓은 범위의 정수 값을 사용할 수 있습니다.
종료 코드에 대한 유일한 규칙은 다음과 같습니다.0은 성공을 나타내고, 다른 값은 실패를 나타냅니다.. 이 규칙은 Unix를 초월합니다. 이는 다른 운영 체제(DOS, Windows 및 종료 코드 개념이 있는 많은 임베디드 시스템을 포함하지만 VMS는 다르게 수행함)에서도 일반적인 규칙입니다. UNIX 시스템에서는 쉘의 부울 구조( if
, while
, &&
, ||
, !
, set -e
, ...) make
와 모든 표준 유틸리티에 내장되어 있습니다. POSIX C 프로그램에서는EXIT_SUCCESS
0이고 EXIT_FAILURE
0이 아닌 값(보통 1)입니다.
실패 종료 코드 선택에 관한 규칙(사실상 또는 법적)은 없습니다. 소수의 POSIX 유틸리티만이 특정 오류 상태 코드를 시행합니다.
!
쉘 연산자는 피연산자가 0을 반환하면 1을 반환합니다. and&&
연산자는||
이전 명령의 상태를 전달합니다.cmp
그리고diff
개별 파일의 경우 1을 반환하고 오류 조건의 경우 ≥2를 반환합니다.expr
식이 0 또는 null로 평가되면 1을 반환하고, 식이 유효하지 않으면 2를 반환하며, 기타 오류에서는 ≥3을 반환합니다.grep
"찾을 수 없음"인 경우 1을 반환하고 오류 조건인 경우 ≥2를 반환합니다. 많은 검색 명령이 이를 따릅니다(그러나find
일치하는 파일이 없으면 0을 반환하지 않음).mesg
예인 경우 0, 아니요인 경우 1, 오류인 경우 ≥2를 반환합니다.patch
블록이 거부되면 1을 반환하고, 기타 오류의 경우 ≥2를 반환합니다.sort -c
파일 데이터가 정렬되지 않은 경우 1을 반환하고 오류가 있는 경우 ≥2를 반환합니다.compress
그리고localedef
특정 오류에 대해 작은 값을 정의하십시오.
더 큰 값이 더 심각한 실패를 의미한다는 공통된 믿음이 있지만 보편적이지는 않습니다. grep
(이 패턴이 존재합니까?) 및 diff
(이 파일이 동일합니까?) 와 같은 부울 조건을 테스트하는 명령의 경우 1은 "아니요"를 의미하고 값이 높을수록 오류를 나타냅니다. 또한,126 이상의 값은 거의 사용되지 않습니다.command
, POSIX 명령 , env
및 nice
와 함께 셸에 구워지기 때문 입니다 nohup
.time
- 126 및 127은 외부 명령 호출 실패를 나타냅니다.
- 128 이상의 값은
$?
명령이 신호에 의해 종료되었음을 나타냅니다.
/usr/include/sysexits.h
몇 가지 값과 그 의미가 나열되어 있지만 sendmail에서 나온 것이고 이메일 전달과 관련이 없는 프로그램 외부에서는 본 적이 없습니다.
즉, 성공하면 0을, 실패하면 1 또는 2를 반환합니다. 실패 조건을 구별해야 하는 경우 1부터 시작하여 더 심각한 실패에 대한 값을 늘립니다.
답변2
종료 상태 규칙
기술적으로는 0에서 255 사이의 값을 사용할 수 있습니다. 그러나 다양한 기존 규칙을 사용할 수 있습니다.
- 종료 코드 1포괄적인 일반적인 오류.
- 종료 코드 64-78은 다음에서 나옵니다.sysexits.h오류의 범주를 나타냅니다. 일반적으로 다음에서 찾을 수 있습니다./usr/include/sysexits.h, Debian/Ubuntu libc6-dev 패키지에 의해 설치됩니다.
- 종료 코드는 다음에서 나옵니다.오류 번호. 다음 명령을 사용하여 찾을 수도 있습니다.오류 번호moreutils 패키지의 명령입니다. 내 시스템에서
errno --list
현재 실행하면 134개의 정의된 오류가 표시됩니다.
문서화 및 디스플레이
일반적으로 스크립트에 사용된 종료 코드나 최소한 준수한 규칙을 문서화하는 것이 좋습니다. 종료하기 전에 고유한 메시지를 표시하는 것도 유용할 수 있습니다. 예를 들면 다음과 같습니다.
# using sysexits.h
echo "EX_USAGE: invalid argument: $1" > /dev/stderr
exit 64
# using errno.h
echo "ENOENT: File not found: $file" > /dev/stderr
exit 2
답변3
0에서 255 사이의 숫자를 사용할 수 있습니다.종료 코드 유지(자세한 내용을 보려면 여기를 클릭하세요.)