Help us understand the problem. What is going on with this article?

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away