読者です 読者をやめる 読者になる 読者になる

perl -e 'sleep 1; die' の exit stauts

perl -e 'print "$^O, $]\n"; sleep 1; die' 2>/dev/null; echo $?

の結果が

% perl -e 'print "$^O, $]\n"; sleep 1; die' 2>/dev/null; echo $?
darwin, 5.018001
60

% /usr/bin/perl -e 'print "$^O, $]\n"; sleep 1; die' 2>/dev/null; echo $?
darwin, 5.016002
60

% perl -e 'print "$^O, $]\n"; sleep 1; die' 2>/dev/null; echo $?
linux, 5.018001
255

% /usr/bin/perl -e 'print "$^O, $]\n"; sleep 1; die' 2>/dev/null; echo $?
linux, 5.010001
2

と様々。なぜこうなるのか。 die の exit status はいつも 255 になるものと思っていた。

P.S.

perldoc によると die の exit statusは

exit $! if $!;              # errno
exit $? >> 8 if $? >> 8;    # child exit status
exit 255;                   # last resort

で決まるらしい(今知ったw)。$!, $? も出力させてみると

% perl -e 'print "$^O, $]\n"; sleep 1; print "\$!=$!, \$?=$?\n"; die' 2>/dev/null; echo $?
darwin, 5.018001
$!=Operation timed out, $?=0
60

% /usr/bin/perl -e 'print "$^O, $]\n"; sleep 1; print "\$!=$!, \$?=$?\n"; die' 2>/dev/null; echo $?
darwin, 5.016002
$!=Operation timed out, $?=0
60

% perl -e 'print "$^O, $]\n"; sleep 1; print "\$!=$!, \$?=$?\n"; die' 2>/dev/null; echo $?
linux, 5.018001
$!=, $?=0
255

% /usr/bin/perl -e 'print "$^O, $]\n"; sleep 1; print "\$!=$!, \$?=$?\n"; die' 2>/dev/null; echo $?
linux, 5.010001
$!=No such file or directory, $?=0
2

要するに、自分の環境は

  • mac の perl で sleep を使うと $!=60 (Operation timed out) がセットされる
  • CentOS 6.4 の /usr/bin/perl は、はじめから $!=2 (No such file or directory) がセットされてる

となっている。これが予期された挙動とは思えない。