Répéter une commande bash jusqu’à ça marche ou que ça plante


Parfois il est utile de spammer son terminal jusqu’à ce que mort s’en suive.

Par exemple, hier nous avions un bug aléatoire qui apparaissait dans une batterie de tests qui prenait quelques minutes à exécuter. Confirmer qu’on avait bien éliminé le problème était délicat.

On est donc allé faire les courses (c’est y pas mignon, le petit couple sam et max au super marché, so kawaï) et j’ai lancé ceci avant de partir faire la queue pendant une heure:

nosetests tests -x; while [[ $? -eq "0" ]]; do nosetests tests -x; done

nosetests tests -x lance tous les tests et plante dès le premier qui foire.

$? -eq "0" vérifie le dernier code de retour, et continue si il est égal à 0 (ce qui veut dire “tout s’est bien passé” en langue Unix).

Ainsi les tests ont tourné pendant toute notre session de chasse au rayon fruits et légumes, et à au retour on a pu constaté qu’ils tournaient toujours. Il y a donc de forte chance que le bug ai été éradiqué, puisqu’avant il se montrait dans les 5 premiers lancements.

On peut aussi faire l’inverse: lancer une commande tant qu’elle foire:

command; while [[ $? -gt "0" ]]; do command; done

6 thoughts on “Répéter une commande bash jusqu’à ça marche ou que ça plante

  • thican

    Haha, et dire que je cherchais ça hier soir, en particulier la commande “lancer la commande tant qu’elle foire”, lorsque j’avais besoin de relancer la connexion wifi. ^^

    Mais entre-temps, j’avais trouvé une autre solution, à peu de chose près en lisant le man comme un bon bourrin.
    2 petites remarques :
    – Chez moi, écrire 2 fois la même commande == source d’erreurs ;)
    – et puis pourquoi -gt (greater than) plutôt que -ne (not equal) ?

    du coup, faire tout simplement :
    while command; do; done

    N’est-elle pas belle la vie ? :D

    Merci encore sinon pour votre site, grande source d’infos et d’astuces :)

  • Sam Post author

    N’étant pas un grand expert de bash, je publie ce qui a marché pour moi. Autant pour Python si j’utilise une méthode suboptimale, il y a souvent une raison pédagogique, autant pour d’autres langages, il y a de forte chance que la réponse à “pourquoi tu as fais x” est “parce que c’est le premier truc que j’ai réussi à faire marcher”.

    Donc les améliorations en com sont toujours les bienvenues.

  • thican

    Mea Culpa.

    J’ai fait une erreur, il s’agit de until à la place de while dans mon exemple. (j’avais écrit le commentaire de mémoire, désolé de ne pas avoir vérifié)

    pour plus de clarté, voici dans le man de bash :
    while list-1; do list-2; done
    until list-1; do list-2; done
    The while command continuously executes the list list-2 as long as the last command in the list list-1 returns an exit status of zero. The until command is identical to the while command, except that the test is negated; list-2 is executed as long as the last command in list-1 returns a non-zero exit status. The exit status of the while and until commands is the exit status of the last command executed in list-2, or zero if none was executed.

    En clair, “while command; do; done” continue d’exécuter la commande si commande retourne 0, et until continue si le code n’est pas 0 ;)

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.