2012-04-29 13 views
5

Spodziewam się, że te wartości są zgodne. Nie pasują one, gdy skrypt powłoki zakończył działanie z powodu jakiegoś błędu (i zwrócił wartość niezerową). Shell $? zwrócił 1, ruby ​​$? zwrócone 256.zwraca wartość statusu skryptu powłoki po wywołaniu z 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

Jaka wersja Ruby? W 1.9.2-p180 "$. Exitstatus" zwraca dla mnie w powłoce tę samą wartość, co '$?'. I w 1.8.7-p334 i 1.9.3-p0. Jaki system operacyjny? –

+0

Tak, otrzymuję '# '. – Chuck

Odpowiedz

16

W języku Ruby $? jest instancją Process::Status. Drukowanie $? jest równoważne wywołaniu $?.to_s, co jest równoważne z $?.to_i.to_s (z dokumentacji).

to_i to nie to samo co exitstatus.

Z dokumentacji:

POSIX informacje rekord systemy procesów z wykorzystaniem 16-bitowej liczby całkowitej. Dolne bity rejestrują stan procesu (zatrzymany, zakończony, sygnalizowany) , a górne bity mogą zawierać dodatkowe informacje (dla przykład kod powrotu programu w przypadku zakończonych procesów).

$?.to_i wyświetli całą tę 16-bitową liczbę całkowitą, ale to, co chcesz to tylko kod wyjścia, więc do tego trzeba zadzwonić exitstatus:

$?.exitstatus 
+0

Co masz na myśli przez wywołanie exitstatus, jak mogę to zrobić? Otrzymuję 'pid 27305 exit 1' jako wyjście Chcę tylko, że 1 inny, który parsuje, co jest najlepszy sposób? –

+0

Nevermind ma status $. Exitstatus –

0

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

Wartość stanu może wynosić 0, EXIT_SUCCESS, EXIT_FAILURE [CX] lub inną wartość, podczas gdy jedynie Ostatnie 8 znaczących bitów (czyli , status & 0377) będzie dostępny dla oczekującego procesu macierzystego.

Status wyjścia uniksowego ma tylko 8 bitów. 256 przepełnień, więc myślę, że zachowanie w tym przypadku jest po prostu niezdefiniowane. Na przykład dzieje się na Mac OS 10.7.3 z 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> 

co jest zgodne z tym, co moja skorupa wskazuje

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

chciałbym zaproponować Ci naprawić skrypt powłoki (jeśli możliwe), aby zwrócić tylko wartości < 256.

Powiązane problemy