Mein Terminal-Thema war früher so:
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_exec
Funktion 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,
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
zsh
...for i in $(seq 1 10); do ls; done
mit 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:
Zuerst
preexec_invoke_exec
muss geändert werden, um Mehrfachausführungen von zu verhindernpreexec
. Ändern Sie außerdempreexec
, um die tatsächliche Anzahl der Zeilen in zu berücksichtigen$PS1
:Um
preexec
erneut ausgeführt zu werden,DONTCLEANPROMPT
muss entweder deaktiviert oder auf gesetzt sein''
. Dies geschieht mitPROMPT_COMMAND
, das unmittelbar vor der Ausgabe der primären Eingabeaufforderung ausgeführt wird. Daherpreexec
wird für jede Befehlszeile einmal und nur einmal ausgeführt.quelle
for
Schleife! Vielen Dank! Es gibt eine weitere Unannehmlichkeit. Was passiert ist, dass wenn Siels
den Befehl ausführen und die Ausgabe haben, dann eine andere ausführenls
, Sie sehen, dass die letzte Zeile der vorherigen Ausgabe gelöscht wird ... haben Sie eine Idee, wie Sie das beheben können?prexec
Drucken""\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.