return 0과 return 1의 목적은 무엇이며 언제 사용하는가 [닫기]

return 0과 return 1의 목적은 무엇이며 언제 사용하는가 [닫기]

코드 블록에서 언제 return 0과 return 1을 사용해야 하는지 알고 싶습니다.

누군가 이것에 대해 자세히 설명해 주시겠습니까?

답변1

Bash에서는 함수의 모든 값을 반환할 수 있지만 8비트로 잘려서 부호가 없게 됩니다. $?로 확인하면 0..255 범위에 있습니다. 상태를 제공하기 위해 return을 사용하지 않으면 함수는 함수 내에서 실행된 마지막 명령의 상태를 반환합니다.

같은 $? 대체 메커니즘은 외부 명령 및 사용자 기능에서 상태를 얻는 데 사용됩니다. 그러나 외부 명령에 대해 다른 예약된 값이 있습니다. 대규모 스크립트에서는 호출이 쉘 함수인지 외부 명령인지 명확하지 않을 수 있으므로 다음과 같은 동일한 규칙을 따르는 것이 좋습니다.

0: 성공. shell -e 옵션이 활성화된 경우 명령이 실제로 작동했더라도 0이 아닌 상태를 반환하면 스크립트가 종료됩니다.

>128: 명령이 신호에 의해 종료되었으므로 완료 상태로 돌아갈 수 없습니다. 시스템에서 제공하는 상태는 (128 + 신호 번호)입니다.

127: 쉘이 새 프로세스를 시작했지만 명령을 찾을 수 없습니다.

126: 쉘이 새 프로세스를 시작했지만 명령이 실행 가능하지 않음을 발견했습니다.

이에 대한 나의 참고 자료는 다음과 같습니다.

https://www.gnu.org/software/bash/manual/bash.html#Exit-Status

같은 문서의 섹션 4.3.1에는 Bash가 상태 0에 특별한 의미를 할당하는 방법을 보여주는 set -e에 대한 설명이 포함되어 있습니다. 이는 각 명령 매뉴얼 페이지의 종료 상태 섹션에서 확인됩니다.

여기에는 "포크할 수 없음" 코드가 표시되지 않습니다. 126과 127은 모두 쉘 자체 하위 프로세스에서 반환된 것 같습니다. fork()는 확실히 실패할 것입니다(-1, errno EAGAIN 또는 ENOMEM을 반환). 하지만 Bash는 결과 상태를 지정하지 않습니다. 분명히 실패하면 이를 처리할 하위 프로세스가 없습니다.

최대 사용자 프로세스 수를 설정하고 새 bash를 시작하는 실험에서 Bash가 중단되어 상태를 읽으려고 할 때 응답하지 않게 되었습니다.

Paul--) prlimit --nproc=400: bash
paul@paul-RV415-RV515 ~ $ export PS1='Limited--) '
Limited--) for j in {1..500}; do
> sleep 300 &
> Rc=$?
> (( Rc > 0 )) && { echo "${Rc}"; break; }
> done
[1] 5954
[2] 5955
....
[53] 6006
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
[54] 6007
[55] 6008
bash: fork: retry: Resource temporarily unavailable
....
[59] 6012
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
Limited--) RC=$?

^C
^C^C
## Killed from another terminal.

답변2

0은 오류가 없음을 의미합니다. 다른 값은 문제가 발생했음을 의미하며 음수 값도 반환될 수 있습니다.

AFAIK에는 0 이외의 반환 값 표준이 없습니다. 0이 아닌 값을 반환하려면 프로그램 사용자에게 다른 값/오류 코드가 무엇을 의미하는지 알려야 합니다.

관련 정보