2012-04-29 30 views
5

Tôi mong đợi các giá trị này sẽ khớp nhau. Chúng không khớp khi kịch bản lệnh shell thoát do một số điều kiện lỗi (và do đó trả lại giá trị khác 0). Shell $? trả về 1, ruby ​​$? trở 256.giá trị trạng thái trả về của tập lệnh shell khi được gọi từ ruby?

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

gì phiên bản của Ruby? Trong 1.9.2-p180, '$ ?. exitstatus' trả về cùng giá trị với' $? 'Trong shell cho tôi. Và trong 1.8.7-p334 và 1.9.3-p0. Hệ điều hành nào? –

+0

Vâng, tôi nhận được '# '. – Chuck

Trả lời

16

Trong Ruby $? là một ví dụ Process::Status. In $? tương đương với việc gọi $?.to_s, tương đương với $?.to_i.to_s (từ tài liệu).

to_i không giống như exitstatus.

Từ các tài liệu:

Posix hệ thống ghi lại thông tin về quá trình sử dụng một số nguyên 16-bit. Các bit thấp ghi lại trạng thái quá trình (dừng, thoát, báo hiệu) và các bit trên có thể chứa thông tin bổ sung (đối với ví dụ mã trả về của chương trình trong trường hợp các quy trình đã thoát).

$?.to_i sẽ hiển thị toàn bộ số nguyên 16-bit này, nhưng những gì bạn muốn chỉ là mã lối ra, vì vậy cho điều này bạn cần phải gọi exitstatus:

$?.exitstatus 
+0

Bạn có ý gì khi gọi exitstatus làm thế nào tôi có thể làm điều đó? Tôi nhận được 'pid 27305 exit 1' như đầu ra Tôi chỉ muốn 1 người khác phân tích cú pháp cách tốt nhất là gì? –

+0

Nevermind nhận được $ ?. exitstatus cho biết trạng thái –

0

Xin xem http://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.html:

Giá trị của tình trạng có thể là 0, EXIT_SUCCESS, EXIT_FAILURE, [CX] hoặc bất kỳ giá trị khác, mặc dù chỉ có ít nhất 8 bit có ý nghĩa (có nghĩa là , trạng thái & 0377) sẽ có sẵn cho quá trình cha mẹ đang chờ.

Trạng thái thoát unix chỉ có 8 bit. 256 tràn vì vậy tôi đoán hành vi trong trường hợp đó chỉ đơn giản là không xác định. Ví dụ điều này xảy ra trên Mac OS 10.7.3 với 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> 

nào là phù hợp với những gì vỏ của tôi chỉ ra

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

Tôi muốn đề nghị bạn sửa chữa vỏ kịch bản (nếu có thể) để chỉ trả về các giá trị < 256.

Các vấn đề liên quan