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".
Si vous remplacez
while true
par:
while [ "$(dropbox status)" != "Up to date" ]
cela fonctionne comme vous le décrivez.
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
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
.
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