从ruby调用时返回shell脚本的状态值?

时间:2012-04-29 17:45:59

标签: ruby

我希望这些值匹配。由于某些错误条件而导致shell脚本退出时,它们不匹配(因此返回非零值)。壳牌$?返回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 

2 个答案:

答案 0 :(得分:16)

在Ruby $?中是一个Process::Status实例。打印$?相当于调用$?.to_s,相当于$?.to_i.to_s(来自文档)。

to_iexitstatus不同。

来自文档:

  

Posix系统使用16位整数记录有关进程的信息。   低位记录过程状态(停止,退出,发出信号)   并且高位可能包含附加信息(for   例如,在退出流程的情况下程序的返回代码。)

$?.to_i将显示整个16位整数,但您想要的只是退出代码,因此您需要调用exitstatus

$?.exitstatus

答案 1 :(得分:0)

请参阅http://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.html

  

status的值可以是0,EXIT_SUCCESS,EXIT_FAILURE,[CX]或任何其他值,但只有最低有效8位(即状态& 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>

这与我的shell指示的内容一致

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

我建议你修改shell脚本(如果可能的话)只返回值&lt; 256。