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_code
será una cadena, ya sea"0\n"
o"1\n"
, porexit_code != 0
lo 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 => 1
system
, comillas invertidas,%x
y seexec
proporciona 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_STATUS
system
devuelvefalse
si el comando tiene un código de salida distinto de cero onil
si no hay ningún comando.Por lo tanto
o
deberían funcionar y son razonablemente concisas.
fuente
No está capturando el resultado de su
system
llamada, que es donde se devuelve el código de resultado:Recuerde que cada
system
llamada 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_code
estrue
si todo salió bien, de lonil
contrario.El
popen3
comando proporciona más detalles de bajo nivel.fuente
Open3.capture3
es un método particularmente fácil de usar para este tipo de tarea.Una forma de hacer esto es encadenarlos usando
and
o&&
:La segunda llamada no se ejecutará si la primera falla.
Puede envolverlos en un
if ()
para darle un poco de control de flujo:fuente