5

我希望这些值匹配。当 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 
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

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

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

我建议您修复 shell 脚本(如果可能)以仅返回 < 256 的值。

于 2012-04-29T18:04:07.543 回答