web-dev-qa-db-fra.com

Répéter la commande de terminal jusqu'à la sortie spécifiée

J'aimerais définir un alias qui exécute une commande toutes les x secondes jusqu'à ce qu'un processus sous-jacent donne une sortie désignée. Ensuite, la commande doit cesser d'être exécutée.

Est-ce possible, et si oui comment? L'aide est très appréciée.

Je suis presque satisfait de

alias test1='while true; do <command>; sleep 1; done'

sauf que je dois l'arrêter manuellement et ne peux donc pas lui faire exécuter une nouvelle commande une fois terminée.

La raison de la question: Dropbox se synchronise mal au travail. Parfois, je dois le redémarrer. Je voudrais le faire en utilisant une commande qui indique également quand la synchronisation est terminée, par exemple. par

alias drop='dropbox stop && dropbox start && while true; do dropbox status; sleep 1; done'

Je voudrais que la répétition soit stoppée lorsque Dropbox affiche "Up to date".

7
Rasmus

Définir une condition pour la boucle while

Si vous remplacez

while true

par:

while [ "$(dropbox status)" != "Up to date" ]

cela fonctionne comme vous le décrivez.

La commande

Arrêter/démarrer Dropbox et terminer après la synchronisation devient alors:

dropbox stop && dropbox start && while  [ "$(dropbox status)" != "Up to date" ]; do dropbox status; sleep 1; done

ou mieux (pour éviter de doubler dropbox status):

dropbox stop && dropbox start && while  [ "$(dropbox status)" != "Up to date" ]; do echo "Updating"; sleep 1 ; done && echo "Finished"

Explication

while true attend une condition de rupture dans la boucle (qui ne vient jamais), mais while [ "$(dropbox status)" != "Up to date" effectue la rupture de la boucle sidropbox status renvoie Up to date

8
Jacob Vlijm

Comme Jacob dit, utilisez la condition sur la boucle. Je suggère une boucle until:

dropbox stop && dropbox start && 
until dropbox status | grep -q "Up to date";
do 
  sleep 1; 
done

until s'exécute jusqu'à ce que la commande retourne true, c'est-à-dire lorsque dropbox status la sortie contient Up to date.

4
muru

Définissez-le comme une fonction dans votre $HOME/.bashrc

syncDropBox()
{
dropbox stop && \
dropbox start && 
while true; 
do 
  STAT="$(dropbox status)"
  if [ "$STAT" = "Up to date"  ] ; then
  break # or add more commands to finilize the process
  fi
  sleep 1; 
done
}

Maintenant, je n'ai pas l'application dropbox cmd. Par conséquent, en fonction de la façon dont elle affiche l'état, vous pouvez la traiter ou non avec AWK ou grep.

Mais le fait est que vous pouvez stocker la sortie dans la valeur ou rediriger la sortie vers une autre commande et les évaluer. Une fois que nous obtenons une chaîne de sortie spécifique - pause

1
Sergiy Kolodyazhnyy