J'écris une application Rails rapide et je me demandais comment je peux valider le succès d'une commande exec'd. Les deux commandes que j'exécute sont et mise à jour SVN, et un cp d'un répertoire à l'autre.Quelle est la meilleure façon de valider une commande de terminal a fonctionné avec succès dans Rails?
Répondre
Si vous utilisez la méthode Kernel.system(), elle renvoie 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 y a une bonne comparaison des différentes commandes système rubis here.
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 faire une vérification de taille de fichier sur le fichier original étant é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
Comment exécutez-vous les commandes externes? La fonction Ruby system()
renvoie true
ou false
selon que la commande a réussi. De plus, $?
contient un état d'erreur.
- Juste pour être pédant, vous ne pouvez pas valider une « commande d parce que
exec
remplace le programme actuel avec leexec
»exec
commande d, de sorte que la commande ne serait jamais revenir à Ruby pour la validation. Pour le cp, au moins, vous feriez probablement mieux d'utiliser le module FileUtils (partie de la 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.
Ouais, exec m'a vraiment jeté quand j'ai commencé à programmer ruby. Fondamentalement, ne l'utilisez pas! –
Que faire si le référentiel subversion n'a pas été modifié? Votre code indiquerait l'échec. Que se passe-t-il si le contenu du fichier a changé mais pas le nombre de blocs alloués (et que l'opération de copie a échoué)? Votre code indiquerait le succès. –