uso - comando de sistema de ruby verifica el código de salida
sintaxis de comandos cmd (5)
De la documentation :
el sistema devuelve
true
si el comando da cero estado de salida,false
para el estado de salida no cero. Devuelvenil
si la ejecución del comando falla.
system("unknown command") #=> nil
system("echo foo") #=> true
system("echo foo | grep bar") #=> false
además
¿Hay un estado de error disponible en
$?
.
system("VBoxManage createvm --invalid-option")
$? #=> #<Process::Status: pid 9926 exit 2>
$?.exitstatus #=> 2
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 la llamada al sistema fue exitosa, y si no, generará un error o hará algo de ese tipo.
¿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
No está capturando el resultado de su llamada al system
, que es donde se devuelve el código de resultado:
exit_code = system("ruby test.rb")
Recuerde que cada llamada al system
o equivalente, que incluye el método de retroceso, genera un nuevo intérprete de comandos, por lo que no es posible capturar el resultado del entorno de un shell anterior. En este caso, exit_code
es true
si todo funcionó, de lo contrario.
El comando popen3
proporciona más detalles de bajo nivel.
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 desde este objeto, incluyendo: código de estado, estado de ejecución, pid, etc.
Algunos métodos útiles de $? objeto:
$?.exitstatus => return error code
$?.success? => return true if error code is 0, otherwise false
$?.pid => created process pid
Una forma de hacerlo es encadenándolas con and
y &&
:
system("VBoxManage createvm --name test1") and system("ruby test.rb")
La segunda llamada no se ejecutará si la primera falla.
Puede envolverlos en un if ()
para darle un poco de control de flujo:
if (
system("VBoxManage createvm --name test1") &&
system("ruby test.rb")
)
# do something
else
# do something with $?
end
system
devuelve false
si el comando tiene un código de salida distinto de cero, o nil
si no hay ningún comando.
Por lo tanto
system( "foo" ) or exit
o
system( "foo" ) or raise "Something went wrong with foo"
debería funcionar, y son razonablemente concisos.