Löschen Sie alte Eingabeaufforderungszeilen in Bash, um Speicherplatz zu sparen


11

Mein Terminal-Thema war früher so:

Terminal sie vor

Aber ich dachte, die Eingabeaufforderung verschwendet so viel Platz. Und später kam mir die Idee, dass ich die Eingabeaufforderung jedes Mal bereinigen könnte, wenn ich einen Befehl ausführte. Ich habe Bash verwendet. Eine Lösung besteht darin, die preexec_invoke_execFunktion zu verwenden.

Ich verwende den folgenden Befehl, um die Zeichen der letzten Eingabeaufforderung zu bereinigen:

echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"

Damit das Terminal so sehr sauber ist,

Geben Sie hier die Bildbeschreibung ein

Aber jetzt ist mein Problem, es wird ein Problem geben, wenn ich mehrere Befehle in einer Zeile verwenden möchte , beispielsweise wenn ich sie verwende for i in ....

Hier ist die Vollversion der Funktion in meiner .bashrc,

preexec () { echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"; echo -n "$1"; echo -ne "  \033[37;2m["; echo -n "$2"; echo -ne "]\033[0m\n"; }
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
    local this_pwd=`pwd`; 
    preexec "$this_command" "$this_pwd"
}
trap 'preexec_invoke_exec' DEBUG

Der Glyph Lefkowitz zsh Trick - schön!

2
Die einfache Lösung beginnt mit zsh...
Gilles 'SO - hör auf böse zu sein'

Ich habe Ihre Frage dort verpasst ...
David Hoelzer

@DavidHoelzer Nun, wenn Sie for i in $(seq 1 10); do ls; donemit seiner Funktion arbeiten, wird die Ausgabe der iterierenden Befehle sozusagen "verschluckt". Daher wollte OP das Verhalten bereinigen und gleichzeitig diese Eingabeaufforderung aktivieren. Der Grund, warum ich dies unterstütze, ist das Interesse an Bewusstsein für die Shell, Benutzerfreundlichkeit, Feedback und Portabilität. Der Link, den ich in meinem vorherigen Kommentar eingefügt hatte, führt zu dem Beitrag über Superuser. Sie haben sich die Mühe gemacht, dieses Snippet zuzuordnen. Es handelt sich also um einen Prototyp, der die native zsh-Funktionalität (die ich für interessant halte) in Form einer Trap-Funktion emuliert Hier.

Antworten:


3

Zuerst preexec_invoke_execmuss geändert werden, um Mehrfachausführungen von zu verhindern preexec. Ändern Sie außerdem preexec, um die tatsächliche Anzahl der Zeilen in zu berücksichtigen $PS1:

preexec () { 
    # delete old prompt; one "\e[1A\e[K" per line of $PS1
    for (( i=0, l=$(echo -e $PS1 | wc -l) ; i < l ; i++ ))
    do             
        echo -ne "\e[1A\e[K"
    done
    # replacement for prompt
    echo -ne "\e[31;1m$ \e[0m"
    echo -n "$1"
    echo -ne "  \e[37;2m["
    echo -n "$2"
    echo -e "]\e[0m"
}

preexec_invoke_exec () {
    [ -n "$DONTCLEANPROMPT" ] && return
    DONTCLEANPROMPT=x
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
    local this_pwd=`pwd`
    preexec "$this_command" "$this_pwd"
}

trap 'preexec_invoke_exec' DEBUG

PROMPT_COMMAND='unset DONTCLEANPROMPT'

Um preexecerneut ausgeführt zu werden, DONTCLEANPROMPTmuss entweder deaktiviert oder auf gesetzt sein ''. Dies geschieht mit PROMPT_COMMAND, das unmittelbar vor der Ausgabe der primären Eingabeaufforderung ausgeführt wird. Daher preexecwird für jede Befehlszeile einmal und nur einmal ausgeführt.


Ihre Lösung löst das Problem mit der forSchleife! Vielen Dank! Es gibt eine weitere Unannehmlichkeit. Was passiert ist, dass wenn Sie lsden Befehl ausführen und die Ausgabe haben, dann eine andere ausführen ls, Sie sehen, dass die letzte Zeile der vorherigen Ausgabe gelöscht wird ... haben Sie eine Idee, wie Sie das beheben können?

1
Sie verwenden wahrscheinlich eine Eingabeaufforderung mit nur einer einzigen Zeile. Ändern Sie das erste Echo in " prexecDrucken" "\033[1A\033[K\033[31;1m$ \033[0m", dh nur eines \033[1A\033[K(1 Zeile nach oben verschieben, bis zum Zeilenende löschen) anstelle von zwei.
Adaephon

Makellos! Vielen Dank für Ihre Lösung und nehmen Sie sich die Zeit, um zu erklären. Dies löst das Problem von OP und debuggt die Lösung noch weiter. Macht es für alle nutzbar! Prost!
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.