Une petite astuce (sous-)shell qu'on oublie.
Supposons qu'on veut automatiser une causerie avec une interface interactive en ligne de commande. Par exemple : bconsole (pilotage de Bacula).
Facile : echo 'delete jobid=XXXX' | bconsole
. On met ça dans une boucle for/while et hop.
Mais si l'on veut lancer plusieurs sauvegardes ? La commande « run » de bconsole attend une confirmation de type "yes/no" pour chaque tâche lancée (ce n'est pas tout à fait vrai, on peut « run job=nomdujob yes », mais il faut s'en souvenir :- ). Il faut introduire une temporisation entre la commande pour lancer la tâche et la saisie de la confirmation (pas vraiment, j'vais y revenir, c'est juste pour présenter le problème).
La problématique serait la même avec une interface qui attend un message de fin (« exit ») explicite pour se fermer (et donc rendre la main à une éventuelle boucle). La plupart des outils sont bien codés (flux d'entrée stocké dans un tampon consommé au fil de l'eau), donc un echo -e 'run job=nomdujob\nyes' | bconsole
fonctionnera très bien. Mais, parfois, on n'a pas l'option « -e » à son echo (il faut se souvenir de dégainer printf…) ou on rencontre des programmes qui bossent en asynchrone.
Astuce : (echo 'run job=nomdujob' && sleep 1 && echo 'yes') | bconsole
.