Quel est le meilleur moyen de valider qu'une commande de terminal a été exécutée avec succès dans Rails?

StackOverflow https://stackoverflow.com/questions/171343

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.

Était-ce utile?

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.

  1. Juste pour être pédant, vous ne pouvez pas valider une commande exec 'd car exec remplace le programme en cours par la exec ' d afin que la commande ne retourne jamais à Ruby pour validation.
  2. 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.
  3. Comme indiqué ci-dessus, la variable prédéfinie $? vous donnera le code de retour de la dernière commande à exécuter par system () 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top