Linux 셸에서 높은 종료 코드(>= 256)가 예상대로 작동하지 않는 이유는 무엇입니까?

Linux 셸에서 높은 종료 코드(>= 256)가 예상대로 작동하지 않는 이유는 무엇입니까?

이상한 동작을 발견했습니다(zsh 및 bash를 사용하여 내 시스템에서 재현 가능).

$ # here everything is still normal
$ bash -c 'exit 1';echo $?
1
$ bash -c 'exit 255';echo $?
255
$ zsh -c 'exit 255';echo $?
255
$ # now it get's crazy
$ bash -c 'exit 256';echo $?
0
$ zsh -c 'exit 256';echo $?
0
$ # (leaving away zsh for now, it is always reproducible with both)
$ bash -c 'exit 257';echo $?
1
$ bash -c 'exit 267';echo $?
11

따라서 256 이후에는 다시 1부터 계산되기 시작합니다. 그런데 왜?

Bash 매뉴얼 페이지에는 최대 수가 표시되지 않습니다.

   exit [n]
          Cause  the  shell  to exit with a status of n.  If n is omitted,
          the exit status is that of the last command executed.  A trap on
          EXIT is executed before the shell terminates.

이것은 매우 혼란스러운 행동입니다. 프로그램이 이에 의존한다면 큰 문제가 발생할 수 있습니다.

그렇다면 왜 이런 일이 발생합니까? 왜 녹음되지 않았나요?

x64, 페도라 26

답변1

설명서에 나와있어요출구시스템 기능:

상태 값은 0, EXIT_SUCCESS, EXIT_FAILURE, [CX] [Option Start] 또는 기타 값일 수 있지만 대기 중인 상위 프로세스에는 최하위 8비트(예: 상태 및 0377)만 사용할 수 있습니다. [옵션 끝]

Linux는 이 표준을 매우 엄격하게 준수하는 것으로 보이며 마지막 8비트만 통과하도록 허용합니다.

답변2

쉘 명령에 대한 POSIX 매뉴얼 페이지에는 다음과 같이 exit(1p)명시되어 있습니다.

요약

exit [n]

설명하다

exit유틸리티는 부호 없는 십진수로 지정된 종료 상태로 쉘이 종료되도록 해야 합니다 n. 지정 되었지만 n0~255 범위 내에 있지 않으면 종료 상태가 정의되지 않습니다.

따라서 이 동작은 POSIX 호환 셸에 대해 문서화되지 않았지만 반드시 이식 가능한 것도 아닙니다.

관련 정보