Drucken Sie etwas in der Konsole an derselben Stelle wie das vorherige Echo mit einer Art negativem Echo

9

In Bash können Sie einen Befehl mit dem Namen clearausführen, um alle Bildschirmbefehle zu löschen.

Und mit können echoSie alles, was Sie wollen, auf dem Bildschirm drucken.

In meinen einfachen Skripten muss ich oft einen Prozentsatz dessen drucken, was mit meinen Befehlen gemacht wird.

Also könnte ich so etwas machen wie ..

echo "89%"
echo "90%"
echo "91%"

und so weiter..

Ich hasse es, den Bildschirm mit prozentualen Updates zu füllen ...

89%
90%
91%
...

Ich möchte erfahren, ob es eine Sonderzeichenkombination gibt (z. B. "\ 033 [01; 31m"), die mit Bash- oder PHP-Echo wiedergegeben werden kann und der Konsole mitteilt, dass das letzte zuvor gedruckte Zeichen entfernt werden soll.

Verwenden Sie dazu Folgendes: (PHP-Beispiel)

echo str_repeat($neg_character, strlen($last_percentage_update_string));
echo $new_percentage_update_string;

Ich würde die neue Zeichenfolge genau an der Position der vorherigen drucken lassen, ohne dass der Bildschirm voller Zeilen wäre

Ansonsten suche ich nach einem Ansatz, um dasselbe auf andere Weise zu tun, wobei ich immer Bash- und PHP-Skripte verwende (bitte geben Sie aktuelle Arbeitsbeispiele an, zumindest mit einer Debian9-Konsole und PHP7).

user3450548
quelle

Antworten:

24

Der typische Weg, dies zu tun, besteht nicht darin, ein einzelnes Zeichen zu löschen, sondern mit einem Wagenrücklauf ( \r) zum Zeilenanfang zurückzukehren :

printf "89%%"; sleep 1; printf "\r90%%\n"

Beachten Sie, dass dies die Linie nicht löscht. Sie müssen sich daher bei Bedarf darum kümmern. Einfache Optionen sind das Hinzufügen von Leerzeichen am Ende oder das Festlegen der Ausgabebreite (z. B. printf "%2d%%\n" 1ergibt ein führendes Leerzeichen).

Es gibt Terminal-Escape-Zeichen, mit denen Sie sich bewegen und Teile des Bildschirms, die CSI-Sequenzen , löschen können. Sie sind jedoch terminalabhängig (obwohl in der Praxis VT100-Escape-Vorgänge jetzt überall unterstützt werden). Zum Beispiel

printf "89%%"; sleep 1; printf "\e[3D90%%\n"

wird verwendet ␛[3D, um drei Zeichen nach links zu verschieben und darüber zu schreiben (unter der Annahme Ihrer printfUnterstützung \e);

printf "89%% hello"; sleep 1; printf "\e[0E\e[K90%%\n"

wird verwendet ␛[0E, um zum Anfang der aktuellen Zeile zu gelangen und ␛[Kzum Ende der Zeile zu löschen (vorausgesetzt, Ihr Terminal unterstützt diese Sequenzen).

tputbietet eine terminale und printf-agnostische Möglichkeit, auf diese Sequenzen zuzugreifen:

printf "89%%"; sleep 1; tput cub 3; tput el; printf "90%%\n"

bewegt den Cursor dreimal nach links ( cub 3) und löscht ihn bis zum Ende der Zeile ( el), wobei die für das aktuelle Terminal geeignete Zeichenfolge verwendet wird;

printf "89%% hello"; sleep 1; tput hpa 0; tput el; printf "90%%\n"

Bewegt den Cursor in die Spalte ganz links ( hpa 0) und löscht sie bis zum Ende der Zeile.

man terminfoHier erfahren Sie, mit welchem ​​„Fähigkeitsnamen“ Sie arbeiten sollen tput.

(Beachten Sie, dass viele der Besonderheiten der obigen Beispiele davon ausgehen, dass sich alle Ihre Ausgaben in derselben Zeile befinden. Sie sollen nicht narrensicher sein, sondern nur verschiedene Ansätze veranschaulichen.)

Eine ähnliche Bildschirmsteuerung in PHP-Skripten finden Sie in der PECL- ncursesErweiterung.

Stephen Kitt
quelle
5
Man kann in der Regel verwendet werden, tput cub 3um die Verschiebung cu RSOR b ack von 3 Spalten , ohne die Sequenz zu codieren, die (und tput elzu e raste die L ine).
Stéphane Chazelas
1. ist \enicht tragbar 2. ist auch nicht\e[0E
Steven Penny
Danke @Steven, ich hatte erwähnt, dass die Sequenzen terminalabhängig sind, aber ich habe einige weitere Qualifikationsmerkmale hinzugefügt.
Stephen Kitt
Man könnte echzum Löschen verwenden. Und um 3 Positionen rückwärts zu gehen hat ein Problem und zwei mögliche Optimierungen, die Vollbildprogramme normalerweise verwenden. Aber sowohl Optimierungen als auch Löschvorgänge sind für einfache Terminal-Inhalte nur für aktuelle Leitungen übertrieben, wenn man diesen Ratschlägen zur Verwendung eines Formatbezeichners mit fester Breite folgt. Vergessen Sie nicht, dass 100das übrigens 3 Stellen lang ist. (-:
JdeBP
Gute Punkte @JdeBP, danke. Sobald Sie 100% erreicht haben, hoffe ich, dass Sie keine Fortschrittsaktualisierungen mehr benötigen ;-).
Stephen Kitt