5

これらの値が一致することを期待していました。何らかのエラー状態のためにシェル スクリプトが終了したときに一致しませんでした (したがって、ゼロ以外の値が返されました)。シェル $? 1 を返した、ルビ $? 256 を返しました。

>> %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 
4

2 に答える 2

16

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

to_iと同じではありませんexitstatus

ドキュメントから:

Posix システムは、16 ビット整数を使用してプロセスに関する情報を記録します。下位ビットはプロセスの状態 (停止、終了、通知) を記録し、上位ビットには追加情報 (たとえば、終了したプロセスの場合のプログラムの戻りコード) が含まれる可能性があります。

$?.to_iこの16ビット整数全体が表示されますが、必要なのは終了コードだけなので、これを呼び出す必要がありますexitstatus

$?.exitstatus
于 2012-04-29T18:08:36.823 に答える
0

Please see http://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.html:

The value of status may be 0, EXIT_SUCCESS, EXIT_FAILURE, [CX] or any other value, though only the least significant 8 bits (that is, status & 0377) shall be available to a waiting parent process.

The unix exit status only has 8 bit. 256 overflows so I guess the behavior in that case is simply undefined. For example this happens on Mac OS 10.7.3 with Ruby 1.9.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>

Which is consistent with what my shell indicates

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

I'd propose you fix the shell-script (if possible) to return only values < 256.

于 2012-04-29T18:04:07.543 に答える