2008-10-05 6 views

Répondre

8

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.

-4

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 
+0

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. –

2

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.

1
  1. Juste pour être pédant, vous ne pouvez pas valider une « commande d parce que exec remplace le programme actuel avec le exec » 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.
  2. 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.
+0

Ouais, exec m'a vraiment jeté quand j'ai commencé à programmer ruby. Fondamentalement, ne l'utilisez pas! –

Questions connexes