GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Löschen Sie die aktuelle gedruckte Konsolenzeile

Einige lohnende Feinheiten...

\33[2K löscht die gesamte Zeile, auf der sich Ihr Cursor gerade befindet

\033[A bewegt den Cursor eine Zeile nach oben, aber in dieselbe Spalte d.h. nicht bis zum Zeilenanfang

\r bringt Ihren Cursor an den Anfang der Zeile (r steht für Carriage Return. Hinweis:Carriage Returns enthalten keinen Zeilenumbruch, sodass der Cursor in derselben Zeile bleibt), aber nicht alles löschen

Speziell in xterm habe ich die oben genannten Antworten ausprobiert, und der einzige Weg, den ich gefunden habe, um die Zeile zu löschen und wieder am Anfang zu beginnen, ist die Sequenz (aus dem obigen Kommentar von @Stephan202 sowie @vlp und @mantal) \33[2K\r

Hinweis zur Implementierung, damit es beispielsweise in einem Countdown-Szenario ordnungsgemäß funktioniert, da ich kein Zeilenumbruchzeichen '\n' verwendet habe am Ende jedes fprintf() , also musste ich fflush() den Stream jedes Mal (um Ihnen etwas Kontext zu geben, habe ich xterm mit einem Fork auf einem Linux-Rechner gestartet, ohne stdout umzuleiten, ich habe nur in den gepufferten FILE-Zeiger fdfile geschrieben mit einem nicht blockierenden Dateideskriptor hatte ich auf der Pseudo-Terminaladresse gesessen, die in meinem Fall /dev/pts/21 war ):

fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);

Beachten Sie, dass ich sowohl die \33[2K-Sequenz verwendet habe, um die Zeile zu löschen, gefolgt von \r Wagenrücklaufsequenz, um den Cursor an den Anfang der Zeile neu zu positionieren. Ich musste fflush() nach jedem fprintf() weil ich am Ende kein Zeilenumbruchzeichen habe '\n' . Dasselbe Ergebnis ohne fflush() würde erfordern, dass die zusätzliche Sequenz eine Zeile nach oben geht:

fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);

Beachten Sie, dass, wenn Sie etwas in der Zeile direkt über der Zeile haben, auf die Sie schreiben möchten, es mit dem ersten fprintf() überschrieben wird. Sie müssten oben eine zusätzliche Zeile lassen, um die erste Bewegung eine Zeile nach oben zu ermöglichen:

i = 3;
fprintf(fdfile, "\nText to keep\n");
fprintf(fdfile, "Text to erase****************************\n");
while(i > 0) { // 3 second countdown
    fprintf(fdfile, "\033[A\33[2KT\rT minus %d seconds...\n", i);
    i--;
    sleep(1);
}

Sie können VT100-Escape-Codes verwenden. Die meisten Terminals, einschließlich xterm, unterstützen VT100. Zum Löschen einer Zeile ist dies ^[[2K . In C ergibt dies:

printf("\33[2K\r");

Sie können einen \r verwenden (Wagenrücklauf), um den Cursor an den Anfang der Zeile zurückzubringen:

printf("hello");
printf("\rbye");

Dies wird Tschüss drucken auf der gleichen Linie. Die vorhandenen Zeichen werden jedoch nicht gelöscht, und weil bye ist kürzer als Hallo , landen Sie bei byelo . Um es zu löschen, können Sie Ihren neuen Druck länger machen, um die zusätzlichen Zeichen zu überschreiben:

printf("hello");
printf("\rbye  ");

Oder löschen Sie es zuerst mit ein paar Leerzeichen und geben Sie dann Ihre neue Zeichenfolge aus:

printf("hello");
printf("\r          ");
printf("\rbye");

Das gibt Hallo aus , dann gehe zum Anfang der Zeile und überschreibe sie mit Leerzeichen, gehe dann wieder zurück zum Anfang und drucke bye .


Linux
  1. Was ist der aktuelle Runlevel des Linux-Systems?

  2. Terminal-Eingabeaufforderung überschreibt aktuelle Zeile?

  3. Zum Anfang der Zeile im Vi-Modus von Bash springen?

  4. Den übereinstimmenden Text an die Zeile anhängen?

  5. ^M am Ende jeder Zeile in vim

8 Tipps für die Linux-Kommandozeile

Lernen Sie, den Sed-Texteditor zu verwenden

Programmieren Sie Hardware über die Linux-Befehlszeile

Meistern Sie die Linux-Befehlszeile

Wie lösche ich gedruckte Zeichen in einer Konsolenanwendung (Linux)?

Wie werden die für den aktuellen Start angegebenen Linux-Kernel-Befehlszeilenparameter angezeigt?