bash: Prompt-Konfiguration

02/02/2009 - 06:22 von Hauke Laging | Report spam
Moin,

ich habe gestern ein bisschen mit meinem Shellpromt herumgespielt,
siehe
http://www.hauke-laging.de/software/prompt/

Das hat soweit ja alles ganz gut funktioniert. Nun hatte ich die
tolle Idee, eine bedingte Formatierung für den exit code einzuführen
(ohne dessen Anzeige im Prompt ich das 258-Phànomen gar nicht
bemerkt hàtte... ;-) ).

Auch das funktioniert im Prinzip:

TERM_RED_START=$'\033[1m\033[31m'
TERM_RED_END=$'\033(B\033[m'
PS1='ec:$(ec=$?; if [ 0 -eq $ec ];
then printf %-3d $ec;
else echo -n "$TERM_RED_START"; printf %-3d $ec;
echo "$TERM_RED_END";
fi) \t \u@\h:\wstart cmd:> '

Was mir nicht so ganz klar ist: Wenn man die Escapesequenzen "direkt"
in PS1 reinschreibt, dann müssen(?) die mit \[ \] "geklammert"
werden. Wenn ich aber erst in $() bestimme, ob ich die Farbe àndere
(exit code > 0 in rot), dann werden die \[ \] ausgegeben. Ich habe
sie also - s.o. - weggelassen, dann ist alles prima.

Ich vermute, dass die Shell erst mal Prompt-Escapes sucht und dann
erst $() auswertet. Aber warum dann überhaupt \[ \]? Warum làsst man
die nicht ganz weg? Die werden ja offenbar nicht ans Terminal
geschickt. Soll die Shell einfach nur wissen (wozu?), dass da jetzt
Steuercodes kommen? Wenn ja, welche Folgen hat es, dass das aus $()
heraus nicht passiert?


CU

Hauke
http://www.hauke-laging.de/ideen/
 

Lesen sie die antworten

#1 Sven Mascheck
02/02/2009 - 20:41 | Warnen spam
Hauke Laging wrote:

Aber warum dann überhaupt \[ \]? Warum làsst man
die nicht ganz weg? Die werden ja offenbar nicht ans Terminal
geschickt. Soll die Shell einfach nur wissen (wozu?), dass da jetzt
Steuercodes kommen?



Zweck: Die Shell muß wissen wieviele druckbare Zeichen der Prompt
enthàlt, um korrekt umbrechen zu können. Sie kann das bei solchen
Sequenzen jedoch nicht ohne weiteres selbst erkennen.

- zumindest, wenn die Escape-Sequenzen im Klartext eingefügt sind;
bei $() kann sie offenbar vor dem Einsetzen selbst nachzàhlen.

[...] echo -n "$TERM_RED_START"; printf %-3d $ec;



PS: könnte man zusammenzuziehen.

Ähnliche fragen