PS1-Problem, CLI durcheinander

16

Ich habe eine einfache PS1-Aufgabe gemacht

PS1="\e[0;31m[\W]\$ \e[m "

Ich wollte nur die Eingabeaufforderungsfarbe ändern und nur den relativen Pfad anzeigen. Dies bringt jedoch die CLI durcheinander. Wenn Sie zum Beispiel den Verlauf mit durchsuchen, wird die Anzeige beschnitten und überlappt. Wenn ich einen langen Befehl eingebe, bewegt sich der Cursor an den Anfang des Bildschirms, der sich mit der Eingabeaufforderungsanzeige selbst überschneidet. Was habe ich falsch gemacht?

yayu
quelle

Antworten:

30

Das liegt daran, dass bash denkt, die Eingabeaufforderung sei länger als sie ist. Die Escape-Sequenz wird \e[0;31mzum Beispiel vom Terminal aufgesaugt, wodurch der folgende Text rot wird, aber bash weiß das nicht. Sie müssen bash also mitteilen, dass diese Zeichenfolge nicht in der Länge der Eingabeaufforderung gezählt werden soll, und Sie tun dies, indem Sie sie einschließen \[ \]. Ich empfehle auch die Verwendung von tput anstelle der Hardcodierung von terminalen Escape-Sequenzen.

red=$(tput setaf 1)
reset=$(tput sgr0)
PS1='\[$red\][\W]\$\[$reset\] '

Weitere Informationen finden Sie in der Einführung zu BashFAQ 53 und Terminalcodes (ANSI / VT100) .

geirha
quelle
1
Vielen Dank für Ihre perfekte Beschreibung Ich hatte dieses Problem mehrmals und weiß nie, wo das Problem war.
Betlista
+1, hier auch. Wenn Sie diese Lösung blind testen und sie nicht funktioniert, sollten Sie hier erwähnen, dass im BashFAQ-Link eine andere Syntax zum Ausblenden von Farben in Funktionen beschrieben ist \001 \002.
Stephen Niedzielski