HOWTO · Bash
Bash-Skript für X Sekunden pausieren
Erfahren Sie, wie Sie ein Bash-Skript mit sleep verzögern oder mit read auf Eingaben warten lassen.
Auf dieser Seite
Ein Bash-Skript lässt sich pausieren, damit jemand eine Nachricht lesen kann, es auf eine interaktive Eingabe wartet oder zwischen Befehlen eine Verzögerung entsteht. Verwenden Sie sleep für eine Verzögerung in ganzen Sekunden und read, wenn das Skript auf eine Eingabe warten soll. Diese Pausen steuern, wann ein Skript fortgesetzt wird; eine Verzögerung koordiniert nicht den Zugriff auf gemeinsam genutzte Dateien.
Bash-Skript für X Sekunden pausieren
Mit sleep und einer ganzzahligen Sekundenangabe verzögern Sie den nächsten Befehl. Die Dauer muss angegeben werden. Das Handbuch zu sleep beschreibt den Befehl. Ob Dezimalwerte oder Einheitenkürzel unterstützt werden, hängt von der auf dem System installierten sleep-Implementierung ab.
Dieses vollständige Bash-Skript gibt eine Nachricht aus, wartet eine Sekunde und gibt anschließend eine weitere Nachricht aus:
#!/usr/bin/env bash
printf '%s\n' 'The script is starting.'
sleep 1
printf '%s\n' 'One second wait requested.'
Die angeforderte Verzögerung ist ein Richtwert und keine Garantie für eine exakt verstrichene Zeit: Durch die Systemplanung kann die tatsächliche Wartezeit länger sein. Um nach einer Verzögerung in ganzen Sekunden eine Aktion zu wiederholen, setzen Sie die Aktion und sleep in eine Schleife. Beschränken Sie die Schleife auf diese Aktion, damit jede Wiederholung eine klare Wirkung hat.
Bash-Skript eine variable Zeit lang pausieren
Speichern Sie die Dauer in ganzen Sekunden in einer Variablen und setzen Sie deren Expansion in Anführungszeichen, wenn Sie sie an sleep übergeben. Dieses Skript wartet standardmäßig fünf Sekunden. Setzen Sie N in der Umgebung, um einen anderen Wert auszuwählen:
#!/usr/bin/env bash
N=${N:-5}
sleep "$N"
printf 'Requested a %s-second wait.\n' "$N"
Zum Beispiel legt N=8 ./your-script.sh den Wert für einen einzelnen Aufruf fest. Der Wert muss eine für die installierte sleep-Implementierung gültige Dauer sein. Anführungszeichen verhindern die Wortaufteilung und die Pfadnamenerweiterung, machen beliebige Eingaben aber nicht zu einer gültigen Dauer. Prüfen Sie daher Werte, die von Benutzern oder anderen nicht vertrauenswürdigen Quellen stammen.
Für eine begrenzte zufällige Verzögerung in ganzen Sekunden können Sie in Bash $RANDOM auf einen Wertebereich beschränken. Das folgende Skript fordert eine Verzögerung von einer bis drei Sekunden an:
#!/usr/bin/env bash
delay=$((1 + RANDOM % 3))
printf 'Requested a %s-second wait.\n' "$delay"
sleep "$delay"
Eine zufällige Verzögerung kann variieren, wann getrennte Skriptläufe beginnen. Sie verhindert jedoch nicht, dass zwei Läufe gleichzeitig in dieselbe Datei schreiben. Verwenden Sie einen geeigneten Sperr- oder Koordinierungsmechanismus, wenn Skripte gemeinsame Ressourcen verwenden.
Bash-Skript anhalten, bis eine Benutzereingabe erfolgt
Der Bash-Befehl read wartet auf eine Zeile von der Standardeingabe. In einem interaktiven Terminal schließt der Benutzer die Zeile üblicherweise durch Drücken der Eingabetaste ab. Mit -r bleiben umgekehrte Schrägstriche in der Eingabe unverändert; -p zeigt eine Eingabeaufforderung an:
#!/usr/bin/env bash
if read -r -p 'Press Enter to continue: ' reply; then
printf '%s\n' 'Continuing.'
else
printf '%s\n' 'No input line was available.'
fi
Dieses Muster setzt eine interaktive Eingabe voraus und kann unbegrenzt auf eine Zeile warten. Wenn das Ende der Standardeingabe erreicht oder die Eingabe umgeleitet wird, kann read zurückkehren, ohne eine Zeile zu erhalten. Durch eine Prüfung des Rückgabestatus kann das Skript diesen Fall behandeln. Weitere Informationen zu Optionen und Verhalten enthält die Bash-Referenz zu read.
Zeitgesteuerte Pausen mit Eingabepausen kombinieren
Verwenden Sie Bash read -t, wenn eine Eingabe die Wartezeit vorzeitig beenden soll und das Skript nach einem Zeitlimit ebenfalls fortfahren darf. Das Zeitlimit wird in Sekunden angegeben; durch die Systemplanung kann die tatsächlich verstrichene Zeit länger sein. Dieses Beispiel meldet, wodurch das Skript fortfahren konnte:
#!/usr/bin/env bash
if read -r -t 5 -p 'Continue now, or wait for the timeout: ' reply; then
printf '%s\n' 'Input received; continuing.'
else
printf '%s\n' 'No line was read before the wait ended; continuing.'
fi
Damit Benutzer eine Verzögerung in ganzen Sekunden festlegen können, lesen Sie den Wert in eine Variable ein und übergeben Sie ihn in Anführungszeichen an sleep. Dieses Beispiel prüft vor dem Aufruf von sleep, ob der Wert kurz und numerisch ist. Es gibt außerdem eine Rückmeldung, wenn keine passende Eingabezeile verfügbar ist:
#!/usr/bin/env bash
if read -r -p 'Enter a whole number of seconds (up to 3 digits): ' duration \
&& [[ $duration =~ ^[0-9]{1,3}$ ]]; then
sleep "$duration"
printf 'Requested a %s-second wait.\n' "$duration"
else
printf '%s\n' 'Enter a whole number with at most 3 digits.'
fi
Der Wert wird geprüft, bevor er an sleep übergeben wird. So gelangt fehlerhafter Text nicht als Dauer zum Befehl. Passen Sie den zulässigen Wertebereich an den Bedarf Ihres Skripts an und erklären Sie diese Grenzen den Benutzern.
Kurz gesagt: Verwenden Sie sleep für eine zeitgesteuerte Verzögerung in ganzen Sekunden und read für Eingaben. Bash read -t verbindet beides: Die Wartezeit endet, sobald eine Zeile eingeht oder das Zeitlimit abläuft.