Lade-Animation im Terminal
Ausgaben im Terminal können informativ aber auch schnell überbordernd sein und zu heiloser Unübersichtlichkeit führen. Hat man es mit der Ausführung von Routine-Skripten zu tun, möchte man womöglich gar keine Rückmeldung mehr erhalten. Wie sich in solchen Fällen eine Lade-Animation dazuschalten lässt, zeigt folgender Beitrag.
Als Beispiel für den Aufruf der Lade-Animation soll ein einfacher ’sleep‘-Befehl dienen. Es folgt das Skript und anschließend die Erklärung dazu:
#!/bin/bash
{
(sleep 5) &
} >/dev/null 2>&1
echo "Lade-Animation im Gange"
while kill -0 $! 2> /dev/null; do
printf '.' > /dev/tty
sleep 1
done
printf '\n' > /dev/tty
Neben der einleitenden Shebang, beginnen wir mit einer geschweiften Klammer, in der wir (nochmals in Klammern) unseren ’sleep 5′ Befehl ausführen, der nichts anderes tut, als einen Prozess zu starten, der 5 Sekunden wartet bis er sich selbst beendet. Die Befehlskette innerhalb dieser Klammern lässt sich übrigens beliebig erweitern. Macht einfach einen Zeilenumbruch und fügt weitere Kommandos hinzu.
Ein Kaufmännisches und (&) setzt den Befehl bzw. die Befehle in den Hintergrund, damit unser Skript an dieser Stelle nicht hängen bleibt. Die geschweiften Klammern werden geschlossen und die Ausgabe des vorangegangenen Befehls nach /dev/null geleitet, sodass hinterher nur unsere gewünschte Lade-Animation übrig bleibt.
Es folgt ein optionaler Text ‚Lade-Animation im Gange‘ der im Terminal ausgegeben wird.
Nun startet die while-Schleife:
while kill -0 $! 2> /dev/null
Diese fragt den zuletzt aufgerufenen Prozess ab (in unserem Fall ’sleep 10′), ob dieser noch existiert und gibt den Exit-Code 0 zurück (im Falle das er noch läuft) bzw. Exit-Code 1. Solange der Prozess also noch aktiv ist, werden die Funktionsanweisungen innerhalb der while Schleife …
printf '.' > /dev/tty sleep 1
… ausgeführt, die jede Sekunde einen Punkt ‚.‘ in die Kommandozeile donnern. Die Anweisung kann wahlweise verändert werden. Die letzte Zeile …
printf '\n' > /dev/tty
… sorgt im übrigen nurnoch dafür, dass wir einen sauberen Zeilenumbruch haben, nachdem das Skript samt while-Schleife durchgelaufen ist.
Die fertige Animation sieht dann in etwa so aus: