Rubyで外部プロセスを実行する際にはsystem
コマンドやバッククオート(`)を使う。
このプロセスの終了ステータスを得るには組み込み変数$?
を使うが、終了ステータスを取ろうとしてto_i
をすると意図したものが取れない。正しくはexitstatus
を呼ぶ必要がある。
例えば
system("ls DONT_EXIST") #=> ls: DONT_EXIST: No such file or directory
pp $? #=> #<Process::Status: pid 8905 exit 1>
pp $?.to_i #=> 256 (256倍されている)
pp $?.exitstatus #=> 1 (シェル上で実行した時に得られる値と同じ)
$?
にはProcess::Status
クラスのインスタンスが格納されている。
これは終了コードだけではなく、どのシグナルで終了したかといった情報も持っている。
公式ドキュメントによれば、to_i
は「C言語での終了ステータス表現の整数を返します。」と書いてあり、通常は上位8ビットに終了ステータスが格納され、下位ビットにはシグナルの情報が格納されている。
よって終了ステータスは、to_i
をしたものを8ビット右シフトする必要がある。
公式ドキュメント
- https://docs.ruby-lang.org/ja/latest/class/Process=3a=3aStatus.html