Warum beendet ZSH eine Zeile mit einem hervorgehobenen Prozentzeichen?

46

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

zsh

Bash

Bildbeschreibung hier eingeben

Das SequenceProgramm 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.outPaket / Klasse verwendet. Stattdessen wird einfach alt verwendet print().

Ist das Fehlen eines neuen Zeilenzeichens der Grund, warum ich dieses Symbol erhalte?

jktravis
quelle

Antworten:

57

Ja, das passiert, weil es sich um eine "Teillinie" handelt. Und standardmäßig geht zsh in die nächste Zeile, um zu vermeiden, dass die Eingabeaufforderung angezeigt wird .

Wenn eine Teilzeile beibehalten wird, wird am Ende der Teilzeile standardmäßig ein umgekehrtes + fettes Zeichen angezeigt: ein "%" für einen normalen Benutzer oder ein "#" für root. Wenn gesetzt, kann mit dem Shell-Parameter PROMPT_EOL_MARK angepasst werden, wie das Ende von Teilzeilen angezeigt wird.

Leiaz
quelle
3
Um dies zu testen: print -n "this is a test"dannprint "this is a test"
SergioAraujo
5
Ich habe jetzt PROMPT_EOL_MARK=''meine .zshrc-Datei eingefügt, um den Unterschied zwischen Zeilenumbruch und Nicht-Ausgabe von Befehlen zu verbergen.
GeekQ
14

Dies ist eine Besonderheit von zsh(und jetzt fishauch), 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:

bash-4.4$ printf XXX
XXXbash-4.4$

Das verstümmelt die Eingabeaufforderung, und es ist leicht zu übersehen, dass dies der Fall ist, XXXbesonders 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.

zshDies 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 :

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

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, sodass zshSie diese Funktion deaktivieren können:

unsetopt prompt_cr prompt_sp

Auf diese Weise zshverhält sich eher wie traditionelle Muscheln.

Sie können diese Markierung auch mit der $PROMPT_EOL_MARKVariablen ändern .

Stéphane Chazelas
quelle