Bash benutzerdefinierte Eingabeaufforderung unterbricht das Umbrechen langer Befehlszeilen


8

Ich habe eine benutzerdefinierte Bash-Eingabeaufforderung, die meinen Benutzernamen, Hostnamen und das aktuelle Arbeitsverzeichnis färbt. Die Farben werden korrekt angezeigt. Wenn ich jedoch eine Befehlszeile eingebe, die umbrochen werden muss, startet das Terminal keine neue Zeile und schreibt über den Anfang meines Befehls. Dies tritt bei RHEL 4 und Debian auf.

Diese Frage beschreibt ein ähnliches Problem unter OS X; Es scheint, dass dies ein Problem mit falsch terminierten Steuersequenzen ist. Ich kann jedoch nicht erkennen, was dies verursachen könnte, da ich überall $ (tput) -Codes verwende, anstatt meine Codes von Hand zu erstellen. Snippet unten - kann jemand raten, was ich falsch mache?

# Control codes

COL_RST=$(tput sgr0)  # Remove all colour formatting
COL_BRIGHT=$(tput bold) # Emphasise

# Foreground
COL_G=$(tput setaf 2) # Green
COL_Y=$(tput setaf 3) # Yello
COL_B=$(tput setaf 4) # Blue

COL_USR=${COL_Y}${COL_BRIGHT}
COL_PWD=${COL_B}${COL_BRIGHT}
COL_HST=${COL_G}${COL_BRIGHT}

# Set prompt
PROMPT="${COL_USR}\u${COL_RST}@${COL_HST}\h${COL_RST}:${COL_PWD}\W${COL_RST}"

# Put it all together....
PS1="[$PROMPT]\$ "

export PS1

Antworten:


8

Schließen Sie jede Ihrer Farbvariablen in eckige Klammern ein:

\[${COL_USR}\]

oder

COL_USR="\[${COL_Y}${COL_BRIGHT}\]"

Das sagt Bash, dass diese als Nullbreite anzusehen sind.

Dies ist genau wie in der Frage beschrieben, auf die Sie verlinkt haben. Wenn Sie den folgenden Befehl ausführen, werden Sie feststellen, dass Ihre Variable ähnliche Zeichenfolgen enthält wie die "handgefertigten". Die Verwendung tputmacht Dinge nur für mehrere $TERMTypen portierbar , hat jedoch keinen Einfluss auf die Länge der Codesequenzen. Es ist diese Länge, die die Dinge abwirft.

echo ${COL_USR} | hexdump -c

Ein Tipp: Diese [...] Sequenzen können nicht verschachtelt werden. Jetzt behoben in meinem Bash-Eingabeaufforderungscode unter serverfault.com/a/479718/79266 (zeigt Git-Zweig, Host usw. und rote Eingabeaufforderung für Produktionsserver).
RichVel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.