2012-04-29 11 views
5

Espero que estos valores coincidan. No coincidían cuando el script de shell se salía debido a alguna condición de error (y por lo tanto devolvía un valor que no era cero). Shell $? devuelto 1, ruby ​​$? devuelto 256.devuelve el valor de estado de un script de shell cuando se llama desde 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

¿Qué versión de Ruby? En 1.9.2-p180, '$ ?. exitstatus' devuelve el mismo valor que' $? 'En el intérprete de comandos para mí. Y en 1.8.7-p334, y 1.9.3-p0. ¿Qué sistema operativo? –

+0

Sí, me sale '# '. – Chuck

Respuesta

16

En Ruby $? es una instancia Process::Status. Impresión $? es equivalente a llamar $?.to_s, lo que equivale a $?.to_i.to_s (a partir de la documentación).

to_i no es lo mismo que exitstatus.

De la documentación:

Posix sistemas de registro de información sobre los procesos que utilizan un número entero de 16 bits. Los bits inferiores registran el estado del proceso (detenido, salido, señalizado) y los bits superiores posiblemente contienen información adicional (para ejemplo, el código de retorno del programa en el caso de procesos salidos).

$?.to_i mostrará toda esta entero de 16 bits, pero lo que quiere es sólo el código de salida, por lo que para ello, tiene que llamar exitstatus:

$?.exitstatus 
+0

¿Qué quiere decir con call exitstatus cómo puedo hacer eso? Obtengo 'pid 27305 exit 1' como salida. Solo quiero que el otro analice de la mejor manera. –

+0

No importa, $. Exitstatus da el estado –

0

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

El valor de estado puede ser 0, EXIT_SUCCESS, EXIT_FAILURE, [CX] o cualquier otro valor, aunque sólo los 8 bits menos significativos (es decir , estado & 0377) estará disponible para un proceso padre en espera.

El estado de salida de unix solo tiene 8 bits. 256 desbordamientos así que supongo que el comportamiento en ese caso simplemente no está definido. Por ejemplo, esto sucede en 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> 

lo cual es consistente con lo que mi concha indica

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

Yo propondría a solucionar el shell-script (si posible) para devolver solo valores < 256.

Cuestiones relacionadas