web-dev-qa-db-ja.com

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の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

3
rugk

exit システム関数のマニュアルに記載されています:

Statusの値は0、EXIT_SUCCESS、EXIT_FAILURE、[CX] [Option Start]またはその他の値ですが、待機中の親プロセスが使用できるのは最下位8ビット(つまり、ステータスと0377)のみです。 【オプション終了】

Linuxは非常に厳密に標準に固執しているようで、最後の8ビットだけを通過させません。

3
PSkocik

シェルコマンドexit(1p)のPOSIXマニュアルページには、次のように記載されています。

あらすじ

exit [n]

説明

exitユーティリティは、符号なし10進整数nで指定された終了ステータスでシェルを終了します。 nが指定されているが、その値が0から255の間でない場合、終了ステータスは未定義です。

したがって、POSIX仕様に準拠するシェルの場合、この動作は文書化されていませんが、必ずしも移植性があるわけではありません。

3
Fox