Warum behält diese Bash-Eingabeaufforderung beim Scrollen durch den Verlauf manchmal Teile vorheriger Befehle bei?

Warum behält diese Bash-Eingabeaufforderung beim Scrollen durch den Verlauf manchmal Teile vorheriger Befehle bei?

Meine Bash-Eingabeaufforderung, die ich, wie ich zugeben muss, von einigen Stellen geklaut und zusammengeschustert habe, fügt beim Scrollen durch den Bash-Verlauf mit den Auf-/Ab-Pfeilen manchmal Teile vorheriger Befehle zu ihrer Länge hinzu.

Meine vorherigen Befehle wären beispielsweise:

ls
cd /home/caleb
vim .bashrc

Wenn ich bei meiner Eingabeaufforderung war und zweimal nach oben gescrollt habe, könnte es so aussehen:

$ vim .bcd /home/caleb

Wobei die ersten fünf Zeichen vom letzten Befehl übrig bleiben.

Hat jemand eine Idee, warum das passiert und wie es gestoppt werden kann?

Meine Eingabeaufforderung wird mit diesem Code festgelegt (viel zu lang, um ihn hier einzufügen):https://gist.github.com/1679352

Antwort1

Irgendwo ist Ihre Eingabeaufforderung fubar. Normalerweise passiert das, dass Ihre Shell denkt, sie gebe nicht druckbare Termcodes aus und erwartet, dass diese Platz beanspruchen. Der beste Rat, den ich Ihnen geben kann, ist, Ihrer Eingabeaufforderung systematisch etwas hinzuzufügen (oder wegzunehmen), bis dieses Verhalten aufhört, um den Code zu isolieren, der dieses Problem verursacht.

Antwort2

Die Farbcodes müssen in eckige Klammern gesetzt werden. Die Klammern informieren bash, dass der eingeschlossene Text nicht gedruckt werden soll

Aufbauend auf dem Beispiel von @Phreditor zeigt dies, dass jede Formatierung nach dem Zeilenumbruch zum ursprünglichen Problem führt:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

Das Einschließen des Formatcodes in [] stellt sicher, dass störendes Verhalten nie auftritt:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

Die Dokumentation:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

Da die Werte durch die PS1-Formatierung sehr lang und schwer lesbar werden, habe ich die Formatcodes in Variablen eingefügt:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

Antwort3

Ich hatte das gleiche Problem und es hing mit den Farbdefinitionen zusammen.

In meinem Fall habe ich eine mehrzeilige Eingabeaufforderung (bietet den meisten Platz für den aktuellen Befehl, unabhängig von der in der Eingabeaufforderung angezeigten Pfadlänge).

Schlechte Version:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

Gute Version:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00mbeendet die Farbe. Wenn es nach der neuen Zeile ( \n) steht, verhindert es das ordnungsgemäße Neuzeichnen im Terminal, da vorherige Befehle mit der Hintergrundfarbe überschrieben werden. Das Verschieben hinter die neue Zeile hat das Problem gelöst.

(mit Terminal unter Mac OS 10.8)

Antwort4

Ich hatte dieses Problem. Was habe ich festgestellt?

Wenn Sie Farben innerhalb der PS1-Variable haben (Beispiel: "\e[35m"), müssen diese IMMER von "\[" und "\]" umgeben sein (Beispiel: "\[\e[35m\]").

Als ich alle Farben in PS1 gemäß dieser Regel markiert habe, hat es funktioniert!

Keine Probleme mehr beim Scrollen durch den Bash-Verlauf.

SCHLECHTES BEISPIEL:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m"; PS1 exportieren

GUTES BEISPIEL:PS1="\[\e[0;36m\][\u@\h[\[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\[\e[0m\] "; exportiere PS1

verwandte Informationen