Gilles hat Ihr Hauptproblem identifiziert, aber ich wollte versuchen, es anders zu erklären.
Bash interpretiert das Escape der speziellen Eingabeaufforderung nur, bevor Variablen in der Eingabeaufforderung erweitert werden. Dies bedeutet, dass die Verwendung \e
in einer Variablen, die über die Eingabeaufforderung erweitert wird, nicht funktioniert, obwohl sie direkt in funktioniert PS1
.
Dies funktioniert beispielsweise wie erwartet und enthält roten Text:
PS1='\e[1;31m this is in red '
Dies ist jedoch nicht der Fall, sondern setzt nur ein Literal \e
in die Eingabeaufforderung:
RED='\e[1;31m'
PS1="$RED not in red "
Wenn Sie die Farb-Escapezeichen in Variablen speichern möchten, können Sie mit ANSI-C-Anführungszeichen ( $'...'
) ein Literal-Escape-Zeichen in die Variable einfügen.
Dazu können Sie Ihre Definition von GREEN
, RED
und ändern NONE
, sodass ihr Wert die tatsächliche Escape-Sequenz ist.
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
Wenn Sie das tun, sollte Ihr erstes PS1
mit den einfachen Anführungszeichen funktionieren:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
Dann haben Sie jedoch ein zweites Problem.
Versuchen Sie, dies auszuführen, und drücken Sie Up Arrowdann Home, und Ihr Cursor springt nicht zum Zeilenanfang zurück.
Um dies zu beheben, ändern Sie die Farb-Escape-Sequenzen PS1
in \[
und \]
um sie herum, z
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
Sie können hier nicht get_exit_status
richtig verwenden, da die Ausgabe sowohl druckende (den Exit-Code) als auch nicht druckbare Zeichen (die Farbcodes) enthält und es keine Möglichkeit gibt, sie in der Eingabeaufforderung korrekt zu markieren. Durch das Setzen wird \[...\]
es als nicht vollständig gedruckt markiert, was nicht korrekt ist. Sie müssen die Funktion so ändern, dass nur der richtige Farbcode gedruckt wird, und ihn dann \[...\]
in der Eingabeaufforderung umgeben.
\[
ist\1
und\[
ist\2
. Diese entsprechen einer Readline-RL_PROMPT_{START,END}_IGNORE
Sache, die sie auffordert, die Bytes beim Zählen der Eingabeaufforderungslänge auf dem Bildschirm zu ignorieren. Siehe lists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html .