LL で異常終了処理する時のイディオム

Tomohiro wrote this on Apr 20, 2011

エラーの際に,メッセージを表示して,プログラムを終了させるという流れを LL で実装する方法を調査してみた.

Ruby/Python/Perl はほぼ想定された動作をしたが,PHP のみ die の引数に文字列を渡すと,ステータスコード “0” を返す,という謎の挙動を示した.

調べてみたところバグではなく PHP の仕様ではあったのだが,個人的にはイケてないなぁと思う.

Ruby

サンプル

#!/usr/bin/env ruby

abort 'Error'

ステータスコード

$ ruby -e "abort 'Error'"
Error
$ echo $?
1

Perl

サンプル

#!/usr/bin/env perl
use strict;
use warnings;

die 'Error';

ステータスコード

$ perl -e "die 'Error'"
Error at -e line 1.
$ echo $?
255

Python

サンプル

#!/usr/bin/env python
import sys

sys.exit('Error')

ステータスコード

$ python -c "import sys; sys.exit('Error')"
Error
$ echo $?
1

PHP

サンプル

#!/usr/bin/env php
<?php

echo 'Error' . PHP_EOL;
die(1);

ステータスコード

$ php -r "die('Error' . PHP_EOL);"
Error
$ echo $?
0
$ php -r "echo 'Error' . PHP_EOL; die(1);"
Error
$ echo $?
1

References