Löschen Sie die gesamte Konsole AUSSER der aktuellen Zeile mit dem Befehl „clear“

Löschen Sie die gesamte Konsole AUSSER der aktuellen Zeile mit dem Befehl „clear“

Die Notwendigkeit, das Terminal zu löschen, aber die aktuelle Zeile mit dem Befehl zu speichern. Im Skript! (Das Skript wird durch den Befehl aufgerufen. Es ist notwendig, das gesamte Terminal VOR diesem Befehl zu löschen, der das Skript aufruft.) Das Wiederherstellen eines Befehls aus dem Verlauf ist nicht geeignet

Erwartetes Anwendungsbeispiel:

  1. Es wird ein Skript erstellt „test.sh“
  2. Wir schreiben einige modifizierte "Clear"-Befehle hinein:
    #!/usr/bin/env bash
    clear
    echo some text
    
  3. Anwenden

Aktueller Terminalstatus:

Bildbeschreibung hier eingeben

Aktuelles Ergebnis nach dem Ausführen von „test.sh“:

Bildbeschreibung hier eingeben

Was ist das Problem? Die Tatsache, dass die Zeile mit dem Befehl verschwunden ist + vscode zeigt das linke Häkchen mit dem Skriptfehlercode nicht an.

Erwartetes Ergebnis:

Bildbeschreibung hier eingeben

Wie es geht?

PS:

Das Problem besteht nicht nur in vscode, in anderen Terminals wird der Befehl auch vollständig gelöscht

Bildbeschreibung hier eingeben

Antwort1

Ein Weg

Wenn Sie eine echte Eingabeaufforderung benötigen, können Sie die Cursormanipulation wie folgt durchführen:

#!/bin/bash

# Save cursor position
printf '\033[s'
# Move the cursor up 1 line
printf '\033[1A'
# Clear the screen
printf '\033[1J'
# Restore cursor position
printf '\033[u'


echo "new thing"

Wenn das obige Beispiel noch weiter optimiert werden muss, siehe beispielsweiseANSI-Escapesequenzen:Cursorbewegungund auchANSI-Escapesequenzenfür mehr davon.

Ein anderer Weg

Sie können es clearbei Bedarf immer noch verwenden und Ihre Eingabeaufforderung anschließend folgendermaßen neu zeichnen:

#!/bin/bash

# Clear the screen
clear
# Build the prompt as it was before "clear"
line="$(printf '%s' "$USER@$HOSTNAME:$PWD$ $0")"
# For "root" prompt i.e. "#", comment out the above line and uncomment the below line
# line="$(printf '%s' "$USER@$HOSTNAME:$PWD# $0")"
# Print the prompt
echo "${line/\/home\/$USER/\~}"


echo "new thing"

Oder auch so:

#!/bin/bash    

clear
line="$USER@$HOSTNAME:$PWD$ "
read -t 0.01 -ei "$(echo "$0")" -p "${line/\/home\/$USER/\~}"
echo


echo "new thing"

Der Schein trügt, aber der Schein ist vielleicht das, was Sie wollen ... Es handelt sich jedoch nicht um eine echte Eingabeaufforderung.

Antwort2

Ihre Frage ist nicht sehr clear(was ironischerweise der Befehl ist, den Sie verwenden möchten), aber ich werde trotzdem versuchen, sie zu beantworten.

Ich verstehe es so, dass Sie ein Skript mit einem Befehl aufrufen (sagen wir, es heißt ./myscript) und den Bildschirm löschen möchten, bevor das Skript ausgeführt wird.

Sie können dies auf zwei Arten tun.

  1. Löschen Sie den Bildschirm und führen Sie dann das Skript aus:

    $ clear; ./myscript
    
  2. Fügen Sie den clearBefehl als erste Zeile in Ihr Skript ein:

     #!/bin/bash
     # Beginning of ./myscript
     clear
    
     # The rest of the script goes here
    

    Führen Sie anschließend einfach das Skript aus, das den Bildschirm löscht und dann mit anderen Dingen fortfährt:

     $ ./myscript
    

Wenn Sie schließlich einen Alias ​​erstellen möchten, der den Bildschirm löscht und dann den letzten Befehl erneut ausführt, können Sie Folgendes definieren:

alias clrun='clear; $(fc -ln -1)'

Beim Ausführen clrunwird dann genau Folgendes bewirkt: Der Bildschirm wird gelöscht und der vorherige Befehl wird erneut ausgeführt.

Wenn dies Ihre Frage nicht beantwortet, müssen Sie viel präziser angeben, was Sie wollen.

verwandte Informationen