2012-04-29 3 views
5

私はこれらの値が一致すると予想しました。シェルスクリプトが何らかのエラー条件のために終了した(そして、ゼロ以外の値を返した)とき、それらは一致しませんでした。シェル$? 1、ルビー$を返す? 256ruby​​から呼び出されたときのシェルスクリプトのステータス値を返しますか?

>> %x[ ls kkr] 
ls: kkr: No such file or directory 
=> "" 
>> puts $? 
256 
=> nil 
>> exit 
Hadoop:~ Madcap$ ls kkr 
ls: kkr: No such file or directory 
Hadoop:~ Madcap$ echo $? 
1 
+0

のRubyのバージョンは何? 1.9.2-p180では、 '$?。exitstatus'はシェルの' $? 'と同じ値を返します。 1.8.7-p334と1.9.3-p0では。どのようなOSですか? –

+0

ええ、私は '#'を取得します。 – Chuck

答えて

16

Ruby $?では、Process::Statusインスタンスです。 $?の印刷は$?.to_sを呼び出すことに相当します。これは$?.to_i.to_sと同等です(ドキュメントから)。

to_iexitstatusと同じではありません。

16ビットの整数を使用するプロセスにおけるPOSIXシステムレコード情報:ドキュメントから

。 下位ビットにはプロセスステータス(停止、終了、信号) が記録され、上位ビットには追加情報が含まれている可能性があります( 例では、終了プロセスの場合の戻りコード)。

$?.to_iあなたがexitstatusを呼び出す必要があり、このためので、この全体の16ビット整数を表示するが、何をしたいことがちょうど終了コードであるだろう。

$?.exitstatus 
+0

exitstatusを呼び出すとどういう意味ですか?私は 'pid 27305 exit 1'を出力として取得します。私はただ1つだけ他のものを解析して、何が最善の方法であることを望みますか? –

+0

それは$?exitstatusステータスを与える –

0

を返さhttp://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.htmlを参照してください。

ステータスの値のみ最下位8ビットが、0、EXIT_SUCCESS、EXIT_FAILURE、[CX]または他の任意の値であってもよい(すなわち、ステータス& 0377)は、待機中の親プロセスに対して利用可能でなければならない。

UNIX終了ステータスは8ビットしかありません。 256オーバーフローので、私はその場合の動作は単純に定義されていないと思います。たとえばこれは、Ruby 1.9.3を搭載したMac OS 10.7.3上で起こる:私のシェルは何を示すかと一致している

irb(main):008:0> `sh -c 'exit 0'`; $? 
=> #<Process::Status: pid 64430 exit 0> 
irb(main):009:0> `sh -c 'exit 1'`; $? 
=> #<Process::Status: pid 64431 exit 1> 
irb(main):010:0> `sh -c 'exit 2'`; $? 
=> #<Process::Status: pid 64432 exit 2> 
irb(main):011:0> `sh -c 'exit 255'`; $? 
=> #<Process::Status: pid 64433 exit 255> 
irb(main):012:0> `sh -c 'exit 256'`; $? 
=> #<Process::Status: pid 64434 exit 0> 

$ sh -c 'exit 256'; echo $? 
0 
$ sh -c 'exit 257'; echo $? 
1 

私はあなたが(もしシェルスクリプトを修正する提案したいです可能な場合)< 256を返します。

関連する問題