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:
- Es wird ein Skript erstellt „test.sh“
- Wir schreiben einige modifizierte "Clear"-Befehle hinein:
#!/usr/bin/env bash clear echo some text
- Anwenden
Aktueller Terminalstatus:
Aktuelles Ergebnis nach dem Ausführen von „test.sh“:
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:
Wie es geht?
PS:
Das Problem besteht nicht nur in vscode, in anderen Terminals wird der Befehl auch vollständig gelöscht
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 clear
bei 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.
Löschen Sie den Bildschirm und führen Sie dann das Skript aus:
$ clear; ./myscript
Fügen Sie den
clear
Befehl 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 clrun
wird 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.