2012-04-29 10 views
5

Mi aspettavo che questi valori corrispondessero. Non corrispondevano quando lo script della shell si chiudeva a causa di una condizione di errore (e quindi restituiva un valore diverso da zero). Shell $? restituito 1, rubino $? restituito 256.restituisce lo stato di uno script di shell quando viene chiamato da 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

Quale versione di Ruby? In 1.9.2-p180, '$ ?. exitstatus' restituisce lo stesso valore di' $? 'Nella shell per me. E in 1.8.7-p334 e 1.9.3-p0. Quale sistema operativo? –

+0

Sì, ricevo '# '. – Chuck

risposta

16

In Ruby $? è un'istanza Process::Status. La stampa $? equivale a chiamare $?.to_s, che equivale a $?.to_i.to_s (dalla documentazione).

to_i non corrisponde a exitstatus.

Dalla documentazione:

Posix informazioni sistemi di record su processi utilizzando un intero a 16 bit. I bit inferiori registrano lo stato del processo (arrestato, uscito, segnalato) ei bit superiori possono contenere informazioni aggiuntive (per esempio il codice di ritorno del programma nel caso di processi usciti).

$?.to_i mostrerà tutto questo intero a 16 bit, ma ciò che si vuole è solo il codice di uscita, quindi per questo è necessario chiamare exitstatus:

$?.exitstatus 
+0

Cosa intendi per chiamare exitstatus come posso farlo? Ottengo 'pid 27305 exit 1' come output Voglio solo che 1 altro che parsing qual è il modo migliore? –

+0

Non importa $?. Exitstatus fornisce lo stato –

0

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

Il valore di stato può essere 0, EXIT_SUCCESS, EXIT_FAILURE, [CX] o qualsiasi altro valore, anche se solo le 8 bit meno significativi (cioè , stato & 0377) deve essere disponibile per un processo padre in attesa.

Lo stato di uscita unix ha solo 8 bit. 256 overflow quindi suppongo che il comportamento in quel caso sia semplicemente indefinito. Per esempio questo accade su Mac OS 10.7.3 con 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> 

che è coerente con quello che il mio guscio indica

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

mi piacerebbe propongo di fissare lo script di shell (se possibile) per restituire solo i valori < 256.

Problemi correlati