Ich möchte einen Fortschrittsbalken implementieren, der die verstrichenen Sekunden in Bash anzeigt. Dazu muss ich die letzte auf dem Bildschirm angezeigte Zeile löschen (Befehl "Löschen" löscht den gesamten Bildschirm, aber ich muss nur die Zeile des Fortschrittsbalkens löschen und durch die neuen Informationen ersetzen).
Das Endergebnis sollte folgendermaßen aussehen:
$ Elapsed time 5 seconds
Dann möchte ich nach 10 Sekunden diesen Satz (an derselben Stelle auf dem Bildschirm) ersetzen durch:
$ Elapsed time 15 seconds
for i in {1..100000}; do echo -en "\r$i"; done
um den seq call zu vermeiden :-)Der Wagenrücklauf selbst bewegt den Cursor nur an den Zeilenanfang. Das ist in Ordnung, wenn jede neue Ausgabezeile mindestens so lang ist wie die vorherige, aber wenn die neue Zeile kürzer ist, wird die vorherige Zeile nicht vollständig überschrieben, z.
Um die Zeile für den neuen Text tatsächlich zu löschen, können Sie hinzufügen
\033[K
, nachdem das\r
:http://en.wikipedia.org/wiki/ANSI_escape_code
quelle
\e[K
statt gekürzt werden\033[K
.\033[G
io\r
bevor\033[K
obwohl offensichtlich\r
ist viel einfacher. Auch unsichtbar-island.net/xterm/ctlseqs/ctlseqs.html enthält mehr Details als Wikipedia und stammt vom xterm-Entwickler.Die Antwort von Derek Veit funktioniert gut, solange die Leitungslänge niemals die Terminalbreite überschreitet. Ist dies nicht der Fall, verhindert der folgende Code die Junk-Ausgabe:
Bevor die Zeile zum ersten Mal geschrieben wird, tun Sie dies
Dadurch wird die aktuelle Cursorposition gespeichert. Verwenden Sie jetzt, wann immer Sie Ihre Zeile drucken möchten
Um zuerst zur gespeicherten Cursorposition zurückzukehren, löschen Sie den Bildschirm vom Cursor nach unten und schreiben Sie schließlich die Ausgabe.
quelle
tput sc # save cursor echo '' > sessions.log.json while [ 1 ]; do curl 'http://localhost/jolokia/read/*:type=Manager,*/activeSessions,maxActiveSessions' >> sessions.log.json echo '' >> sessions.log.json cat sessions.log.json | jq '.' tput rc;tput el # rc = restore cursor, el = erase to end of line sleep 1 done
tput ed
eher als verwendentput el
. @ Ums Beispiel verwendeted
(vielleicht hat er es behoben, nachdem Sie kommentiert haben).Die \ 033-Methode hat bei mir nicht funktioniert. Die \ r-Methode funktioniert, löscht jedoch nichts, sondern setzt den Cursor einfach an den Zeilenanfang. Wenn die neue Zeichenfolge kürzer als die alte ist, sehen Sie den verbleibenden Text am Ende der Zeile. Am Ende war tput der beste Weg. Es hat neben dem Cursor-Material noch andere Verwendungszwecke und ist in vielen Linux- und BSD-Distributionen vorinstalliert, sodass es für die meisten Bash-Benutzer verfügbar sein sollte.
Hier ist ein kleines Countdown-Skript zum Spielen:
quelle
Wenn die Fortschrittsausgabe mehrzeilig ist oder das Skript das neue Zeilenzeichen bereits gedruckt hätte, können Sie Zeilen mit folgenden Elementen überspringen:
printf "\033[5A"
Dadurch springt der Cursor 5 Zeilen nach oben. Dann können Sie alles überschreiben, was Sie brauchen.
Wenn das nicht funktionieren würde, könnten Sie es versuchen
printf "\e[5A"
oderecho -e "\033[5A"
, was den gleichen Effekt haben sollte.Grundsätzlich können Sie mit Escape-Sequenzen fast alles auf dem Bildschirm steuern.
quelle
tput cuu 5
, wobei 5 die Anzahl der Zeilen ist (cuu
nach oben,cud
nach unten).Verwenden Sie das Wagenrücklaufzeichen:
quelle
Kann es durch Platzieren des Wagenrücklaufs erreichen
\r
.In einer einzigen Codezeile mit
printf
oder mit
echo -ne
quelle