Tengo un montón de llamadas al sistema en ruby como las siguientes y quiero verificar sus códigos de salida simultáneamente para que mi script salga si ese comando falla.
system("VBoxManage createvm --name test1")
system("ruby test.rb")
Quiero algo como
system("VBoxManage createvm --name test1", 0) <- donde el segundo parámetro verifica el código de salida y confirma que esa llamada al sistema fue exitosa, y si no, generará un error o hará algo por el estilo.
¿Es eso posible?
Intenté algo parecido a esto y tampoco funcionó.
system("ruby test.rb")
system("echo $?")
o
`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
raise 'Exit code is not zero'
end

exit_codeserá una cadena, ya sea"0\n"o"1\n", porexit_code != 0lo que siempre será ciertoRespuestas:
De la documentación :
además
fuente
[10] pry(main)> system("touch /root/test 2> /dev/null") => false [11] pry(main)> $?.exitstatus => 0 [12] pry(main)> system("touch /root/test 2> /dev/null"); $?.exitstatus => 1system, comillas invertidas,%xy seexecproporciona aquí: stackoverflow.com/questions/6338908/…Para mí, preferí usar '' para llamar a los comandos de shell y marcar $? para obtener el estado del proceso. El $? es un objeto de estado de proceso, puede obtener la información de proceso del comando de este objeto, que incluye: código de estado, estado de ejecución, pid, etc.
Algunos métodos útiles de $? objeto:
fuente
$?es$CHILD_STATUSsystemdevuelvefalsesi el comando tiene un código de salida distinto de cero onilsi no hay ningún comando.Por lo tanto
o
deberían funcionar y son razonablemente concisas.
fuente
No está capturando el resultado de su
systemllamada, que es donde se devuelve el código de resultado:Recuerde que cada
systemllamada o equivalente, que incluye el método backtick, genera un nuevo shell, por lo que no es posible capturar el resultado del entorno de un shell anterior. En este casoexit_codeestruesi todo salió bien, de lonilcontrario.El
popen3comando proporciona más detalles de bajo nivel.fuente
Open3.capture3es un método particularmente fácil de usar para este tipo de tarea.Una forma de hacer esto es encadenarlos usando
ando&&:La segunda llamada no se ejecutará si la primera falla.
Puede envolverlos en un
if ()para darle un poco de control de flujo:fuente