Wenn also wget
eine Webseite aufgerufen wird, wird eine Statusleiste angezeigt, die angibt, wie viel die Datei (en) heruntergeladen wurden. Es sieht aus wie das:
25%[=============>______________________________________] 25,000 100.0K/s
(Unterstriche sind Leerzeichen. Ich konnte nur nicht herausfinden, wie ich mehr als ein Leerzeichen hintereinander einfügen kann.)
Anstatt jedoch eine weitere Zeile in stdout zu schreiben und eine weitere Fortschrittsanzeige hinzuzufügen, wird diese folgendermaßen aktualisiert:
50%[===========================>________________________] 50,000 100.0K/s
Und das wget
ist auch nicht das einzige Beispiel. Wenn Sie beispielsweise etwas einleiten less
und dann beenden, ist Ihre ursprüngliche Eingabeaufforderung immer noch vorhanden, zusammen mit dem Ergebnis der zuvor ausgeführten Befehle. Es ist, als wärst du nie gegangen.
Meine Fragen sind also, wie heißt das, wie implementiere ich es, funktioniert es jeweils nur für eine einzelne Zeile, und kann ich das in C verwenden?
Antworten:
Zuallererst hat Ihre Frage nichts mit Bash zu tun, sondern mit dem Terminal. Das Terminal antwortet auf die Anzeige des Textes der Programme und die Bash selbst hat nach dem Start keine Kontrolle über die Programme.
Terminals bieten Steuersequenzen zur Steuerung von Farbe, Schriftart, Cursorposition und mehr. Eine Liste der standardisierten Terminalsequenzen finden Sie beispielsweise unter http://www.termsys.demon.co.uk/vtansi.htm
um einen Fortschrittsbalken zu erstellen.
Fortgeschrittenere Terminal-Escape-Sequenzen sind typischerweise terminalabhängig, zB arbeiten sie nur mit Eterm oder xterm. ncurses - ist eine Programmierbibliothek, mit der Sie interaktive Programme mit dem Terminal erstellen können, sodass Sie keine Escape-Sequenzen verwenden müssen.
So überschreiben Sie eine vorhandene Zeile mit terminalen Sequenzen
So überschreiben Sie eine bestehende Zeile ohne Klemmenfolge
Eine einfache Lösung besteht darin, am Ende keine neue Zeile, sondern einen Wagenrücklauf zu schreiben, der den Cursor im Grunde genommen an den Zeilenanfang zurücksetzt, z.
Der
\r
Zeilenumbruch oder der Zeilenumbruch setzen den Cursor an den Anfang der Zeile und ermöglichen es Ihnen, den Inhalt der Zeile zu überschreiben.Zwischen Puffern wie
less
oder wechselnvi
Das Verhalten von
less
ist auch auf eine erweiterte Terminalfunktion zurückzuführen, den alternativen Bildschirm:http://rosettacode.org/wiki/Terminal_control/Preserve_screen listet einige Beispiele auf, wie Sie dies selbst tun können, entweder über tput oder über einige Escape-Sequenzen.
quelle
Verwenden Sie -
echo
, anstatt automatisch eine neue Zeile an den String anzuhängen.printf "%s\r" whatever
Der Wagenrücklauf setzt den Cursor an den Anfang der aktuellen Zeile. Beispiel:quelle
printf "\r%2d " $num