2010-04-21 9 views
7

Tengo un script Perl que llama a otro script. La secuencia de comandos de Perl debe estar propagando el código de retorno del script pero parece devolver cero a su llamador (una aplicación Java). Describa la llamada explícita al .¿Por qué mi script Perl devuelve un código de retorno cero cuando explícitamente invoco exit con un parámetro distinto de cero?

Código y la salida de la siguiente manera (me di cuenta de que <=> podría/debería ser != pero eso es lo que tengo):

print "INFO: Calling ${scriptDirectory}/${script} ${args}" 
$scriptReturnCode = system("${scriptDirectory}/${script} ${args}"); 

if ($scriptReturnCode <=> 0) { 
     print "ERROR: The script returned $scriptReturnCode\n"; 
     exit $scriptReturnCode; 
} else { 
     print "INFO: The script returned $scriptReturnCode.\n"; 
     exit 0; 
} 

La salida que tengo desde el Java es:

20/04/2010 14:40:01 - INFO: Calling /path/to/script/script.ksh arg1 arg2 
20/04/2010 14:40:01 - Could not find installer files <= this is from the script.ksh  
20/04/2010 14:40:01 - ERROR: The script returned 256 
20/04/2010 14:40:01 - Command Finished. Exit Code: 0 <= this is the Java app. 

Respuesta

9

Usted necesita cambiar el código de retorno de la llamada system() por 8 bits.

E.g. $exit_value = $? >> 8; # ¿En su script el $? es $ scriptReturnCode

De http://perldoc.perl.org/perlfaq8.html:

system() ejecuta un comando y devuelve información de estado de salida (como un valor de 16 bits: los bajos 7 bits son la señal del proceso murió a causa de, en su caso, y el alto 8 bits son el valor de salida real

Un código más expandida comprobación de coredumps así podría tener este aspecto:

system(); 
if ($? == -1) { 
    print "failed to execute: $!\n"; 
} elsif ($? & 127) { 
    printf "child died - signal %d, %s coredump\n", 
      ($? & 127), ($? & 128) ? 'with' : 'without'; 
} else { 
    printf "child exited with value %d\n", $? >> 8; 
} 

ACTUALIZACIÓN: según el excelente recordatorio del ysth, los códigos de salida se truncan en 8 bits (bajos), por lo que devolver 256 en lugar del previsto 1 termina como 0. De forma similar, devolver 257 termina como 1.

+0

Supongamos que quiere decir 'shift' como en' $ scriptReturnCode = $ scriptReturnCode >> 8; ' –

+0

Sí, actualizado. – DVK

+2

Idealmente, agregue explícitamente que los códigos de salida se truncan en 8 bits (bajos), por lo que devolver 256 en lugar del 1 previsto termina como 0. De forma similar, devolver 257 termina como 1, etc. – ysth

1

Si captura $? y cambiando su valor es demasiado problema para recordar, puede simplificar el código mediante el uso de IPC::System::Simple, que mejora system() y acentos abiertos con la comprobación de errores y diagnósticos más, por ejemplo:

use IPC::System::Simple qw(run EXIT_ANY); 

my $command = "${scriptDirectory}/${script} ${args}"; 
print "INFO: Calling $command\n"; 

# runs command through a shell first; does not die on any exit value 
run(EXIT_ANY, $command); 
my $scriptReturnCode = $IPC::System::Simple::EXITVAL; 
Cuestiones relacionadas