J'ai un tas d'appels système dans ruby tels que les suivants et je veux vérifier leurs codes de sortie simultanément afin que mon script se termine si cette commande échoue.
system("VBoxManage createvm --name test1")
system("ruby test.rb")
Je veux quelque chose comme
system("VBoxManage createvm --name test1", 0)
<- où le deuxième paramètre vérifie le code de sortie et confirme que cet appel système a réussi, et sinon, il déclenchera une erreur ou fera quelque chose de ce genre.
Est-ce possible du tout?
J'ai essayé quelque chose du genre et cela n'a pas fonctionné non plus.
system("ruby test.rb")
system("echo $?")
ou
`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
raise 'Exit code is not zero'
end
exit_code
sera une chaîne - soit"0\n"
ou"1\n"
, doncexit_code != 0
sera toujours vraiRéponses:
De la documentation :
en outre
la source
[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
, backticks,%x
etexec
fournie ici: stackoverflow.com/questions/6338908/…Pour moi, j'ai préféré utiliser `` pour appeler les commandes shell et vérifier $? pour obtenir le statut du processus. Le $? est un objet d'état de processus, vous pouvez obtenir les informations de processus de la commande à partir de cet objet, y compris: code d'état, état d'exécution, pid, etc.
Quelques méthodes utiles du $? objet:
la source
$?
est$CHILD_STATUS
system
renvoiefalse
si la commande a un code de sortie différent de zéro, ounil
s'il n'y a pas de commande.Par conséquent
ou
devraient fonctionner et sont raisonnablement concis.
la source
Vous ne capturez pas le résultat de votre
system
appel, c'est là que le code de résultat est renvoyé:Souvenez-vous que chaque
system
appel ou équivalent, qui inclut la méthode backtick, génère un nouveau shell, il n'est donc pas possible de capturer le résultat de l'environnement d'un shell précédent. Dans ce cas ,exit_code
esttrue
si tout a fonctionné,nil
autrement.La
popen3
commande fournit plus de détails de bas niveau.la source
Open3.capture3
est une méthode particulièrement simple à utiliser pour ce type de tâche.Une façon de le faire est de les chaîner en utilisant
and
ou&&
:Le deuxième appel ne sera pas exécuté si le premier échoue.
Vous pouvez les envelopper dans un
if ()
pour vous donner un contrôle de flux:la source