私は奇妙な動作を発見しました(私のシステムで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のmanページには、最大数があることが示されていません。
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、Fedora 26
exit システム関数のマニュアルに記載されています:
Statusの値は0、EXIT_SUCCESS、EXIT_FAILURE、[CX] [Option Start]またはその他の値ですが、待機中の親プロセスが使用できるのは最下位8ビット(つまり、ステータスと0377)のみです。 【オプション終了】
Linuxは非常に厳密に標準に固執しているようで、最後の8ビットだけを通過させません。
シェルコマンドexit(1p)
のPOSIXマニュアルページには、次のように記載されています。
あらすじ
exit [n]
説明
exit
ユーティリティは、符号なし10進整数n
で指定された終了ステータスでシェルを終了します。n
が指定されているが、その値が0から255の間でない場合、終了ステータスは未定義です。
したがって、POSIX仕様に準拠するシェルの場合、この動作は文書化されていませんが、必ずしも移植性があるわけではありません。