J'essaie de trouver un moyen simple de continuer à réexécuter une commande chaque fois qu'elle se termine, pour une raison quelconque (erreur ou autre).
Quelle serait la meilleure façon d'aborder cela?
EDIT: Je n'étais pas assez clair avant. J'ai besoin que la prochaine exécution attende que la précédente se termine.
EDIT 2: Presque toutes les réponses fonctionnent très bien. Je pensais à tort que la plupart des réponses déboucheraient sur le processus ou le ré-exécuter une seule fois, ce qui n’est ni souhaité.
Réponses:
Cela crée une boucle infinie, s'exécutant
command
encore et encore.la source
while true; do echo 'Hit CTRL+C'; sleep 1; done
grâce à cyberciti.biz/faq/bash-infinite-loopLa
watch
commande répétera une commande pour toujours avec un intervalle spécifié:La mise
-n
à zéro réduit effectivement l'intervalle à zéro (je pense que c'est vraiment 0,1 secondes).watch
offre également l’avantage supplémentaire d’aligner la sortie afin que les modifications visuelles soient facilement visibles, et dispose d’un commutateur pour mettre en évidence les modifications depuis la dernière exécution.Référence: la page de manuel de la montre :
la source
watch ls
dans un répertoire contenant des fichiers, vous n'obtenez rien?Une solution simple serait:
;
sépare les commandes, permettant plusieurs commandes sur une seule ligne ( Bash: Lists )!#
indique à bash de "répéter tout ce que j'ai écrit jusqu'à présent dans cette ligne" ( Bash: Event-Designators )la source
yourcommand; !!
cela ne semble pas fonctionner avec les commandes de la même ligne!#
. À votre santé!; !#
n'a pas fonctionné sur ZSH, il élargit simplement la déclaration en le clonant, cela ne le déclenche pasVous pouvez planifier à l’avance pendant l’exécution de la commande (à condition qu’elle ne soit pas interactive) et
!!
indiquer qui exécutera à nouveau la commande précédente. Cela fonctionne par exemple pendantping -c 5
.Vous pouvez également définir une fonction dans
bash
:Pour le persister, stockez-le dans
~/.bashrc
.Ensuite, vous pouvez exécuter votre commande comme ceci:
S'il s'agit d'une commande spécifique que vous souhaitez exécuter de manière répétée (et non par exemple une commande), vous pouvez remplacer
"$@"
cet extrait par votre commande actuelle et nommer la fonction, par exemplerepeat_ping
.Pour en faire une boucle infinie, vous pouvez faire ce que @Dennis suggère. Je vous recommande d’ajouter une période d’attente si vous avez l’intention de l’utiliser dans un shell interactif, comme ceci:
Sinon, il est plutôt gênant d’abandonner cette boucle infinie
Ctrl-Z
.la source
Donne à une
while
boucle une condition booléenne comme suit:Cela s'exécutera encore et encore jusqu'à ce que bash reçoive un signal pour mettre fin au processus. Habituellement sous la forme de
ctrl+c
.Vous pouvez également utiliser la
watch
commande pour exécuter un script à plusieurs reprises. Par exemple, une simple horloge dans votre terminal bashwatch
peut ressembler à ceci:L'
-t
option indiquewatch
de ne pas afficher le titre du processus en cours d'exécution. Cela vous donne une sortie propre de seulement la commande qui est répétée. L'-n1
option indique à la montre de se répéter toutes lesn
secondes. Dans ce cas,-n1
seront des intervalles de1
seconde. Ensuite, ladate +%T
commande affiche l'heure au moment de l'achèvement de la commande. Cette commande vous donnera une horloge active dans votre terminal.Et puis une autre méthode qui ne figure dans aucune des autres réponses serait un appel de fonction infini.
Ceci est essentiellement identique à la
while
boucle booléenne utilisant uniquement des appels de fonction récursifs.(edit) Pour garder les ressources de votre machine à l'esprit, j'ai ajouté le
&& wait
afin que, chaque fois qu'un processus est exécuté, les boucles "attendent" que le processus se termine avec le statut de sortie 0 avant la prochaine itération. Ceci est utile dans un script shell interactif.la source
while
exemple de boucle mais il n'utilise pas detrue
syntaxe booléenne . Il y a unwatch
exemple mais cela ne donne pas beaucoup de syntaxe utile. Je les expose pour qui que ce soit qui peut aider. Je voulais leur donner une utilité pratique. Lawhile
boucle booléenne peut également être exécutéefalse
et ne pas l'exécuter tant qu'une condition fausse n'est pas remplie. C'est assez pratique.if
continuer à se ré-exécuter?if
instructionC'est une autre méthode que j'utilise pour répéter une commande dans bash. Cela peut paraître ridicule à certains car il ne s’agit pas d’écrire un script et peut être connu de beaucoup. Mais je pense que cela vaut la peine d’être mentionné car c’est rapide et convivial, dans le sens où il n’ya pas beaucoup de syntaxe à retenir. Je n'ai testé cela que dans gnome-terminal d'Ubuntu et d'autres terminaux pourraient ne pas le supporter.
Vous n'avez pas à attendre pour coller jusqu'à ce que chaque commande se termine. Les commandes collées entrent dans une file d'attente et s'exécutent les unes après les autres.
la source
Je me sens énervé aujourd'hui.
Lire l’un des flux infinis et le diriger vers
xargs
Si vous avez besoin de faire une petite pause, vous devrez probablement exécuter
sh
la source