Quel est le meilleur moyen de valider qu'une commande de terminal a été exécutée avec succès dans Rails?
-
05-07-2019 - |
Question
J'écris une application rapide Rails et je me demandais comment valider le succès d'une commande exec'd. Les deux commandes que je suis en train d’exécuter sont une mise à jour SVN et une cp d’un répertoire à un autre.
La solution
Si vous utilisez la méthode Kernel.system () il renverra un booléen indiquant le succès de la commande.
result = system("cp -r dir1 dir2")
if(result)
#do the next thing
else
# handle the error
Il existe une bonne comparaison des différentes commandes du système Ruby ici .
Autres conseils
Comment exécutez-vous les commandes externes? La fonction Ruby system ()
renvoie true
ou false
selon que la commande a abouti ou non. De plus, $?
contient un statut d'erreur.
- Juste pour être pédant, vous ne pouvez pas valider une commande
exec
'd carexec
remplace le programme en cours par laexec
' d afin que la commande ne retourne jamais à Ruby pour validation. - Pour le cp, au moins, vous feriez mieux d'utiliser le module FileUtils (faisant partie de la bibliothèque Ruby Standard Library) plutôt que de passer au shell.
- Comme indiqué ci-dessus, la variable prédéfinie
$?
vous donnera le code de retour de la dernière commande à exécuter parsystem ()
ou l'opérateur backtick.
Pour la mise à jour SVN, vérifiez le numéro de version avant et après la mise à jour.
svn_start_version = IO.popen("svn info").readlines[4]
`svn update`
svn_end_version = IO.popen("svn info").readlines[4]
if svn_end_version > svn_start_version
"success"
end
Pour le cp, vous pouvez effectuer une vérification de la taille du fichier original, égal au fichier copié.
source_file_size = IO.popen("du file1").readlines
`cp file1 file2`
dest_file_size = IO.popen("du file2").readlines
if dest_file_size == source_file_size
"success"
end