Ich versuche, eine einfache Möglichkeit zu finden, um einen Befehl immer dann erneut auszuführen, wenn er beendet wird, aus irgendeinem Grund (Fehler oder auf andere Weise).
Was wäre der beste Weg, dies zu erreichen?
EDIT: Ich war vorher nicht klar genug. Ich brauche die nächste Ausführung, um zu warten, bis die vorherige beendet ist.
EDIT 2: Fast alle Antworten funktionieren prima. Ich dachte fälschlicherweise, dass die meisten Antworten den Prozess entweder verzögern oder ihn nur einmal erneut ausführen würden, was nicht erwünscht ist.
Antworten:
Dies erzeugt eine Endlosschleife, die
command
immer wieder ausgeführt wird.quelle
while true; do echo 'Hit CTRL+C'; sleep 1; done
dank cyberciti.biz/faq/bash-infinite-loopDer
watch
Befehl wiederholt einen Befehl für immer mit einem festgelegten Intervall:Das Setzen
-n
auf Null setzt das Intervall effektiv auf Null (ich denke, es ist wirklich 0,1 Sekunden).watch
Darüber hinaus bietet es den zusätzlichen Vorteil, die Ausgabe so auszurichten, dass visuelle Änderungen leicht sichtbar sind, und verfügt über einen Schalter zum Hervorheben von Änderungen seit der letzten Ausführung.Referenz: die Watchmanpage :
quelle
watch ls
in einem Verzeichnis, das Dateien enthält, nichts bekommen?Eine einfache Lösung wäre:
;
trennt Befehle und ermöglicht mehrere Befehle in einer Zeile ( Bash: Lists )!#
fordert bash auf, "alles zu wiederholen, was ich bisher in dieser Zeile geschrieben habe" ( Bash: Event-Designators )quelle
yourcommand; !!
eigentlich nicht mit Kommandos in der gleichen Zeile gearbeitet wird, aber!#
zu tun scheint. Prost!; !#
hat bei ZSH nicht funktioniert, es erweitert nur die Aussage im Wesentlichen,Sie können während der Befehlsausführung im Voraus planen (vorausgesetzt, es ist nicht interaktiv) und eingeben,
!!
welches Programm den vorherigen Befehl erneut ausführen soll. Dies funktioniert zB währendping -c 5
.Sie können eine Funktion auch definieren in
bash
:Um es zu speichern, speichern Sie es in
~/.bashrc
.Dann können Sie Ihren Befehl wie folgt ausführen:
Wenn es sich um einen bestimmten Befehl handelt, den Sie wiederholt ausführen möchten (und nicht z. B. einen Befehl), können Sie ihn
"$@"
in diesem Snippet durch Ihren tatsächlichen Befehl ersetzen undrepeat_ping
stattdessen z . B. die Funktion benennen .Um es zu einer Endlosschleife zu machen, können Sie das tun, was @Dennis vorschlägt. Ich empfehle Ihnen, eine Wartezeit hinzuzufügen, wenn Sie dies in einer interaktiven Shell verwenden möchten:
Andernfalls ist es ziemlich unpraktisch, diese Endlosschleife mit abzubrechen
Ctrl-Z
.quelle
Geben Sie einer
while
Schleife eine boolesche Bedingung wie folgt:Dies wird immer wieder ausgeführt, bis die Bash ein Signal zum Beenden des Prozesses erhält. Normalerweise in Form von
ctrl+c
.Sie können den
watch
Befehl auch verwenden , um ein Skript wiederholt auszuführen. Zum Beispiel könnte eine einfache Uhr in Ihrem Bash-Terminal folgendermaßenwatch
aussehen:Die
-t
Option gibtwatch
an, dass kein Titel des ausgeführten Prozesses angezeigt werden soll. Dadurch erhalten Sie eine saubere Ausgabe nur des Befehls, der wiederholt wird. Die-n1
Option weist die Uhr an, sich allen
Sekunden zu wiederholen . In diesem Fall-n1
werden Intervalle von1
Sekunden sein. Danndate +%T
zeigt der Befehl die Zeit zum Zeitpunkt der Befehlsbeendigung an. Durch Ausführen dieses Befehls erhalten Sie eine aktive Uhr in Ihrem Terminal.Und dann wäre eine weitere Methode, die in keiner der anderen Antworten enthalten ist, ein unendlicher Funktionsaufruf.
Dies ist im Wesentlichen dasselbe wie die Boolesche
while
Schleife, die nur rekursive Funktionsaufrufe verwendet.(Bearbeiten) Um die Ressourcen Ihres Rechners im Auge zu behalten, habe ich die hinzugefügt,
&& wait
damit jedes Mal, wenn ein Prozess ausgeführt wird, die Schleifen "warten", bis dieser Prozess mit dem Beendigungsstatus 0 endet, bevor die nächste Iteration erfolgt. Dies ist in einem interaktiven Shell-Skript nützlich.quelle
while
Schleifenbeispiel, das jedoch keine booleschetrue
Syntax verwendet. Es gibt einwatch
Beispiel, aber es gibt nicht viele nützliche Syntax. Ich erkläre dies für wen es auch helfen mag. Ich wollte diesen etwas praktischen Nutzen geben. Derwhile
Schleifen-Boolesche Wert kann auch ausgeführt werdenfalse
und erst dann ausgeführt werden, wenn eine unwahre Bedingung erfüllt ist. Es ist sehr praktisch.if
die Ausführung fortgesetzt?if
Anweisung selbst aufruft .Dies ist eine andere Methode, die ich verwende, um einen Befehl in bash zu wiederholen. Dies mag für manche albern klingen, da sie kein Skript schreiben müssen und vielen bekannt sein könnten. Aber ich denke, es ist erwähnenswert, da es schnell und anfängerfreundlich ist, in dem Sinne, dass es nicht viel Syntax gibt, an die man sich erinnern kann. Ich habe dies nur in gnome-terminal von Ubuntu getestet und andere Terminals unterstützen dies möglicherweise nicht.
Sie müssen nicht warten, bis die einzelnen Befehle ausgeführt wurden. Die eingefügten Befehle werden in eine Warteschlange gestellt und nacheinander ausgeführt.
quelle
Ich fühle mich heute frech.
Lesen Sie aus einem der unendlichen Streams und leiten Sie es an
xargs
Wenn Sie dort eine kleine Pause einlegen müssen, müssen Sie wahrscheinlich ausführen
sh
quelle