Lange Zeilen überlappen sich in der benutzerdefinierten Eingabeaufforderung von Bash PS1

13

Ich habe eine ausgefallene zweizeilige PS1Bash-Eingabeaufforderung mit Servernamen, Uhrzeit, Benutzername und anderen nützlichen Variablen konfiguriert .

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

Bildbeschreibung hier eingeben

Vollständige Github-Quelle hier .

Das Problem ist, dass lange Zeilen häufig um sich selbst gewickelt werden, was bedeutet, dass die neue Zeile die vorherige Zeile überlappt.

Das Problem ist inkonsistent: Einige Zeilen werden korrekt umbrochen, andere nicht.

Irgendeine Idee, wie man das behebt?

Adam Matan
quelle

Antworten:

16

Hier ist meine ausgefallene zweizeilige PS1 für die Bash-Eingabeaufforderung.

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

Also hier ist was ich getan habe. Wenn das meine Farbe wäre:

\e[1;32m

Ich habe es geändert in:

\[\e[1;32m\]

Im Wesentlichen müssen Sie es einschließen in:

\[$mycolor\]

Diese Antwort auschecken .

varunyellina
quelle
+1 Danke. Seltsamerweise scheint es auf einem Mac nicht zu funktionieren.
Adam Matan
Du bist ein Lebensretter! Was Mac angeht, Adam. Es liegt höchstwahrscheinlich an der Anzahl der Spalten. Stellen Sie die Eingabeaufforderung auf eine Zeichenfolge ein, z. B. "Dies ist meine Eingabeaufforderung:", und prüfen Sie, ob das Problem weiterhin besteht. In diesem Fall ist Ihre Spalteneinstellung auf Ihrem Terminal entweder zu breit oder zu schmal.
Alex Summers
7

Wir haben diese Lösung online gefunden, die eine schließende Klammer für Farbvariablen vorschlug:

Ändere das:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

zu:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

Ich habe die Änderung übernommen - hoffe, sie funktioniert wie erwartet.

Adam Matan
quelle
1
Ich bin mir nicht sicher, was damit erreicht werden soll. Sie müssen etwas wickeln , die nicht Raum (ansi-Fluchten) in Anspruch nehmen \[ \], so dass Sie nicht nur können all ansi-Escape - Farben mit Ende , \]denn was , wenn es nicht ein \[. Wenn Sie nicht druckbare Zeichen einfügen, sollten Sie diese einfach einwickeln \[ \](z PS1='\[\e[32;1m\] green prompt \[\e[0m\] $'. B. ).
Dylnmc
Tatsächlich! Ohne das Öffnen von \ [wird die Eingabeaufforderung für uns Linux-Benutzer durchbrochen. Vielleicht ist es anders für OSX? Wie seltsam. \ [und \ e [werden als zwei verschiedene Dinge für Linux interpretiert. Der erste zeigt an, dass die folgende Sequenz nicht gedruckt werden kann und nicht als Teil der angezeigten Zeichen der Eingabeaufforderung zu zählen ist. Das \ e [ist die Escape-Klammer, um ein ANSI-Farbschema zu starten.
Alex Summers
0

Meine bevorzugte Lösung für das Problem der Überlappung langer Zeilen in der Bash-PS1 besteht darin, \nam Ende der PS1-Eingabeaufforderung (en) eine Zeile (n) zu setzen.

z.B

Bildbeschreibung hier eingeben

Wenn du all meine anderen Sachen haben willst - Zeit, Benutzer, Host, Verzeichnis und Git-Zweig (!), Kannst du dies benutzen (Mac oder Linux):

/unix//a/124012/10043

Michael Durrant
quelle
für git branch solltest du verwenden if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. Dies ist ein Standard, wenn Sie git in ein Skript einfügen und den Namen des Zweigs nach dem auswerten, was ich zuvor gelesen habe.
Dylnmc