LoginSignup
0

More than 3 years have passed since last update.

外部プロセス実行時の終了ステータスは`$?.to_i`では取得できない

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0