[gelöst]Probleme mit farbigem Bash-Echo

Du kommst mit der Installation nicht voran oder willst noch was nachfragen? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
Mebuh
Beiträge: 122
Registriert: 21.06.2004 15:27:19
Wohnort: München

[gelöst]Probleme mit farbigem Bash-Echo

Beitrag von Mebuh » 02.07.2004 20:28:33

Hi,

Ich hab' vor kurzem in meiner .bashrc die PS1-Variable gesetzt, um eine farbige Prompt zu bekommen:

Code: Alles auswählen

PS1='\e[1;31m\u@\e[1;34m\h:\e[0m\w\$ '
Seitdem hab' ich aber einige Probleme:

Wenn ich einen langen Befehl eingebe, wird die Zeile ca. 10Zeichen vor dem rechten Rand umgebrochen. Ausserdem wird nicht in der nächsten Zeile weitergeschrieben, sondern in der Zeile, in der auch schon der erste Teil steht.
Wenn ich dann auch noch versuche den langen Befehl in der History (mit der Pfeil-Hoch-Taste) aufzurufen, wird der selbe Sch*** angezeigt und das Echo der Bash wandert um eine Zeile nach oben.

Hat irgendwer eine Lösung für dieses Problem parat???

Thx
Mebuh
Zuletzt geändert von Mebuh am 19.12.2006 13:31:36, insgesamt 1-mal geändert.

Benutzeravatar
fred19726
Beiträge: 507
Registriert: 18.07.2002 03:38:38
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Heidelberg (DE)
Kontaktdaten:

Beitrag von fred19726 » 02.07.2004 21:29:19

Hi,

genau solche Probleme hatte ich auch als ich ein farbeigen Prompt wollte, und nach einer langen zeit rumprobieren bin ich darauf gekommen das die Bash SEHR sensibel ist was die PS1 Variable angeht:

\e fuktioniert aus irgend einem grund nicht zuverlässig :roll:

Das hier sollte funzen:

Code: Alles auswählen

PS1="\[\033[1;31m\]\u@\[\033[1;31m\]\h:\[\033[0m\]\w\$ "

p.s. so sieht meine PS1 variable aus ;)

Code: Alles auswählen

# check if we are in a login shell
if shopt -q login_shell; then
    # dark blue
    PS1_LOGIN_COLOR=34
else
    # light blue
    PS1_LOGIN_COLOR=32
fi

# check if we are root
if [ $USER = 'root' ] ; then
    # red
    PS1_USER_COLOR=31
else
    # green
    PS1_USER_COLOR=32
fi

# print time and return previous exit code
function ps1_time {
    local ec=$?
    echo $(date +%H:%M)
    return $ec
}

# print color number and return previous exit code
function ps1_smily_color {
    local ec=$?
    if [[ $ec = "0" ]]
	then
	echo -e "32"
    else 
	echo -e "31"
    fi
    return $ec
}

# print smily or exit code an return previous exit code
function ps1_exit_code {
    local ec=$?
    if [[ $ec = "0" ]]
	then
	echo -e ":)"
    else
	echo -e "$ec :("
    fi
    return $ec
}

PS1="\[\033[m\]<\[\033[36m\]\$(ps1_time) \[\033[${PS1_USER_COLOR}m\]\u\[\033[m\]@\[\033[${PS1_LOGIN_COLOR}m\]\h \
\[\033[m\][\[\033[35m\]\w\[\[\033[m\]]> \
\[\033[1;\$(ps1_smily_color)m\]\$(ps1_exit_code) \[\033[0m\]"
PS2="> "
2 Dinge sind Unendlich, das Universum und die Menschliche Dummheit,
wobei ich mir beim Universum nicht sicher bin
-- Albert Einstein

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 02.07.2004 21:50:07

Du musst escape-Sequenzen in \[ und \] einschliessen, damit Bash diese Zeichen beim berechnen der Stringlänge nicht mitzählt

@Fred: \033 und \e sind äquivalent, du hast halt auch \[ und \] benutzt, deshalb geht es

Für's Protokoll: Mein PS1 sieht so aus

Code: Alles auswählen

\[\e[1;33m\]\u\[\e[0;36m\]@\h\[\e[0;35m\] \D{%t%a, der %e. %b %Y%t%H:%M:%S}\n\[\e[0;32m\][\!] \[\e[1;37m\]\w\[\e[m\]\$ 
(Ganz selten treten noch probleme auf, wenn der Pfad länger als eine Zeile ist)

Benutzeravatar
fred19726
Beiträge: 507
Registriert: 18.07.2002 03:38:38
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Heidelberg (DE)
Kontaktdaten:

Beitrag von fred19726 » 02.07.2004 22:02:48

@Fred: \033 und \e sind äquivalent, du hast halt auch \[ und \] benutzt, deshalb geht es
Theoretisch: JA

Praktisch: Nicht ganz, ich hab ewigkeiten rumprobiert mit allen möglichen kombinationen, und die einzige wie wirklich ohne Probleme funktioniert ist eben \[\033[x;xxm\], und \t hat auch Probleme gemacht, deshalb die ps1_time funktion
2 Dinge sind Unendlich, das Universum und die Menschliche Dummheit,
wobei ich mir beim Universum nicht sicher bin
-- Albert Einstein

Mebuh
Beiträge: 122
Registriert: 21.06.2004 15:27:19
Wohnort: München

Beitrag von Mebuh » 03.07.2004 11:02:47

Super, :D

Hat funktioniert:

Code: Alles auswählen

PS1='\[\e[1;31m\]\u@\[\e[1;34m\]\h:\[\e[0m\]\w\$ '
Danke!

Antworten