Ich habe dies gelegentlich mit einer Vielzahl von Anwendungen bemerkt. Ich habe oft gedacht, dass dies daran lag, dass die Ausgabe vorzeitig abgebrochen wurde (z. B. Strg + C), und zsh füllt ein neues Zeilenzeichen aus. Aber jetzt hat die Neugier das Beste aus mir herausgeholt, da es nicht so zu sein scheint.
zsh
Bash
Das Sequence
Programm stammt aus einem Buch, als ich über Java-Zertifizierungen las, und wollte nur sehen, ob es kompiliert und ausgeführt werden kann. Ich habe bemerkt, dass es nicht die println()
Methode aus dem System.out
Paket / Klasse verwendet. Stattdessen wird einfach alt verwendet print()
.
Ist das Fehlen eines neuen Zeilenzeichens der Grund, warum ich dieses Symbol erhalte?
print -n "this is a test"
dannprint "this is a test"
PROMPT_EOL_MARK=''
meine .zshrc-Datei eingefügt, um den Unterschied zwischen Zeilenumbruch und Nicht-Ausgabe von Befehlen zu verbergen.Dies ist eine Besonderheit von
zsh
(und jetztfish
auch), damit Sie nicht abgeschlossene Zeilen in der Ausgabe eines Befehls deutlich sehen können.In herkömmlichen Shells wird die nächste Eingabeaufforderung der Shell an die letzte nicht abgeschlossene Zeile angehängt , wenn ein Befehl nach dem letzten Zeilenumbruchzeichen Daten ausgibt oder mit anderen Worten, wenn der Terminalcursor nicht am Zeilenanfang steht wie in:
Das verstümmelt die Eingabeaufforderung, und es ist leicht zu übersehen, dass dies der Fall ist,
XXX
besonders wenn Sie eine schickere Eingabeaufforderung wie diese haben. Dies wirkt sich auch auf die Cursorpositionierung aus, die zu Anzeigefehlern führt, wenn Sie den Cursor bewegen.zsh
Dies wird umgangen, indem gezeigt wird, dass die Ausgabe eine nicht abgeschlossene Zeile mit einem%
Zeichen in Fettdruck und in umgekehrter Reihenfolge enthält, und die nächste Eingabeaufforderung am Anfang der nächsten Zeile ausgegeben wird :Dies geschieht durch Ausgabe des umgekehrten Videos
%
am Ende jedes Befehls (vor jeder Eingabeaufforderung), gefolgt von 79 Leerzeichen (vorausgesetzt, ein 80 Zeichen breites Terminal), einem CR-Zeichen (das Zeichen, das den Cursor veranlasst, zum ersten zurückzukehren) Spalte) und die zu löschende Sequenz bis zum Ende der Zeile (und dann der Eingabeaufforderung).Auf diese Weise wird der Cursor bei einer nicht abgeschlossenen Zeile, da sich der Cursor nicht an der ersten Position befindet, mit diesen 80 Zeichen in die nächste Zeile verschoben (und diese
%
bleibt erhalten). Wenn nicht, dann stehen das%
und diese 79 Leerzeichen in einer Zeile, die anschließend gelöscht wird.Das funktioniert jetzt nur, wenn das Terminal Zeilenumbrüche vornimmt (was zum Beispiel danach nicht mehr richtig funktioniert
tput rmam
). Wenn Sie über ein langsames Terminal verfügen (wie bei einer seriellen 9600-Baud-Leitung), werden diese möglicherweise%
nach jedem Befehl angezeigt und entfernt, sodasszsh
Sie diese Funktion deaktivieren können:Auf diese Weise
zsh
verhält sich eher wie traditionelle Muscheln.Sie können diese Markierung auch mit der
$PROMPT_EOL_MARK
Variablen ändern .quelle