Prompt anpassen und einfärben

In diesem Artikel möchte ich euch zeigen wie ihr auf eurem System den Prompt anpassen könnt.
Als Prompt bezeichnet man die Zeile, die ihr sehen könnt wenn ihr eine Shell öffnet. Sie sieht zum Beispiel so aus:

root@ubuntu:/home#

Da wir Individualisten sind möchten wir den Prompt natürlich nach unseren Vorstellungen anpassen.

Prompt Grundlagen

Die aktuelle Konfiguration des Promptes wird in einer Variable gespeichert. Die Variable lautet: „PS1“.
Ihr könnt das auch mal überprüfen, dazu öffnet ihr einfach eine Shell und gebt folgendes ein:

ubuntu@meinubuntu.de:~$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@meinubuntu.de\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

Bei euch kann die Ausgabe anders aussehen.
Wir wissen nun also in welcher Variable die Konfiguration gespeichert wird.
Wenn du nun ein wenig Ahnung von Programmiersprachen hast, dann weißt du das man Variablen definieren kann und genau das wollen wir jetzt machen.
Tippe zum Spaß folgendes in die Shell ein:

PS1=“

Wie du unschwer erkennen kannst verschwindet der Prompt nun komplett. Eine logische Reaktion, da wir jegliche Konfigurationsanweisungen entfernt haben. (Übrigens: Du kannst natürlich auch in diesem Zustand noch Befehle in die Shell eintippen)

Für den Fall das ihr jetzt Panik bekommen habt, weil eurer Standardprompt verschwunden ist, dann kann ich euch beruhigen. Schließt die Shell einfach und öffnet eine neue, dann sollte der Prompt wieder da sein.

Mit der dauerhaften Speicherung des Promptes beschäftigen wir uns weiter unten. Wir wollen uns erst einmal einen schönen Prompt basteln, dabei kommt uns die temporäre Speicherung gerade richtig.

Wenn wir uns jetzt noch einmal den vordefinierten Prompt anschauen, dann sehen wir viele solcher Zeichenfolgen: „\u“, diese Folgen nennt man Sequenzen.

Eine kleine Übersicht über die gängigsten und in meinen Augen sinnvollsten Sequenzen findest du in folgender Tabelle (Eine größere Zusammenstellung findest du hier):

Zeichen Erklärung
\d Datum in folgender Formatierung: „Mo Apr 27“
\h Der Host, also der Computername (sowas wie ‚meincomputer‘)
\j Die Summe der mit STRG+Z abgebrochenen Befehle.
\l
\n Neue Zeile, für Mehrzeilige Prompts
\r
\s Der Name der Shell (z.B. „bash“), im weitesten Sinne auch die Version.
\t Die Zeit im 24-Stundenformat: „21:26:04“
\T Die Zeit im 12-Stundenformat: „09:26:46“
\@ Die Zeit im 12-Stundenformat mit am/pm:
\u Dein Benutzername
\v Die Version deiner Bash z.B. „3.2“
\V Die Version deiner Bash mit dem entsprechenden Pachtlevel z.B. „3.2.39“
\w Das Verzeichnis in dem du dich befindest, mit Pfad
\W Das Verzeichnis in dem du dich befindest, ohne Pfad
\! Die Anzahl der im history-puffer gespeicherten Kommandos
\# Die Anzahl der Kommandos während einer Shell-Sitzung
\$ Wenn du root bist erscheint ein „#“, sonst „$“
\\ Ein Backslash

Nun können wir uns schon einen ansehnlichen Prompt basteln! Das machen wir nun auch sofort, anschließend bringen wir noch ein wenig Farbe ins Spiel.

Ich schlage als Basis folgende Sequenzen vor: \t, \u und \w.
\t sagt uns die Uhrzeit, \u mit welchem User wir eingeloggt sind und \w in welchem Verzeichnis wir uns gerade befinden.
Ich schlage vor wir verpacken den Prompt noch schön in eckigen Klammern und trennen die jeweiligen Sequenzen mit : und @.
Das ganze sieht dann so aus:

PS1='[\t:\u@\w]‘

Zur Verdeutlichung: Ihr könnt alle möglichen Zeichen zwischen den Sequenzen verwenden, also ihr könnt zum Beispiel auch folgendes als Prompt definieren: PS1=’Ich bin der aller beste:\u‘. All dies gibt keine Fehler. Ihr müsst lediglich, wenn ihr Backslashs dargestellt haben wollt, darauf achten das ihr einen doppelten Backslash tippt: „\\“. Das war schon alles, mehr Regeln gibt es nicht.

So sieht der Prompt bis jetzt aus:

[18:38:08:ubuntu@~]

Bei euch wird die Darstellung abweichen, da ihr den Prompt Mitsicherheit nicht um die gleiche Uhrzeit ausprobiert und ihr euren Host eventuell anders genannt habt.

Den Prompt farbig machen

Zunächst zeige ich euch ein Bild, welches euch alle verfügbaren Farben anzeigt. Das Skript, welches diese Anzeige erzeugt hat, kannst du hier finden.

Die linken Werte (30-37) sind für die Textfärbung verantwortlich. Die 1 gibt an ob Fett oder nicht.
Die oberen Werte (40-47) für die Hintergrundfärbung.

Den Prompt einfärben geht eigentlich ganz einfach. Den Farbmodus aktivierst du mit „\e“, darauf folgt eine rechteckige Klammer „[„, dann kommen die Farbwerte und hinter den letzten Farbwert kommt ein „m“, wenn du den Text zusätzlich noch Fett haben möchtest, musst du ein 1m am Ende anfügen. Das „m“ vor dem Hintergrundwert muss dann entfernt werden. Das war es schon. Textfarbwert und Hintergrundfarbwert sind übrigens beliebig vertauschbar, also die Reihenfolge spielt keine Rolle.

Die Syntax verallgemeinert (nicht nutzen):

\e[[Textfarbwert];[Hintergrundfarbwert]m
oder für Fett
\e[[Textfarbwert];[Hintergrundfarbwert];1m

Diese Schreibweise ist erstens nicht ganz sauber und zweitens färbt diese Methode alles Rot, auch die Befehle die im Nachhinein eingegeben werden.

Zunächst kümmern wir uns um das zurücksetzen auf die normalen Farben, dazu schreiben wir einfach folgendes „\e[0m“ an die Stelle an der wir die Einfärbung beenden möchten.

Nun kommen wir zu dem Problem der Sauberkeit. Damit unser Prompt sauber definiert ist benötigen wir diese beiden Sequenzen „\[“ und „\]“. Sie schließen den Text zusätzlich ein, wenn ihr sie nicht setzt dann wird eurer Prompt bei manchen Befehlen versagen.

Also die absolute Verallgemeinerte Form ist folgende:

\[\e[[Textfarbwert];[Hintergrundfarbwert]m\](Text/Sequenzen)\[\e[0m\]
oder für Fett:
\[\e[[Textfarbwert];[Hintergrundfarbwert];1m\](Text/Sequenzen)\[\e[0m\]

Wenn ihr nun ein wenig Verwirrt seit, dann wird es durch die nun folgenden Beispiele hoffentlich ein wenig klarer.

Damit du später meinen Prompt besser verstehen kannst, gebe ich dir in dieser kleinen Tabelle an in welcher Farben ich meine jeweiligen Sequenzen bzw. Trennzeichen färben möchte.

Sequenz/Text Farbe
[ bzw. ] Blau, Fett
\t Lila, Fett
\u Rot, Fett
\w Grün
@ Rot, Fett
: Blau, Fett

Der Prompt in die „Promptsyntax“ umgesetzt sieht dann so aus:

PS1=’\[\e[34;1m\][\[\e[0m\]\[\e[35;1m\]\t\[\e[0m\]\[\e[34;1m\]:\[\e[0m\]\[\e[31;1m\]\u\[\e[0m\]\[\e[31;1m\]@\[\e[0m\]\[\e[32m\]\w\[\e[0m\]\[\e[34;1m\]]\[\e[0m\]‘

Ich gebe zu es sieht sehr Chaotisch aus, deswegen hier einmal ein wenig aufgebröselt:

\[\e[34;1m\]
[
\[\e[0m\]

\[\e[35;1m\]
\t
\[\e[0m\]

\[\e[34;1m\]
:
\[\e[0m\]

\[\e[31;1m\]
\u
\[\e[0m\]

\[\e[31;1m\]
@
\[\e[0m\]

\[\e[32m\]
\w
\[\e[0m\]

\[\e[34;1m\]
]
\[\e[0m\]

Ihr könnt es so leider nicht in die Shell rein tippen, weil er euch sonst Zeilenumbrüche rein macht.

Es ist teilweise unnötig die Farbe immer wieder auf Null zusetzen, aber es ist im Endeffekt wesentlich praktikabler, weil wenn ihr nicht alles wieder auf 0 setzt und vorher eine Sequenz Rot und Fett markiert habt und bei der nächsten Sequenz die Farbe ändern wollt und diese Sequenz nicht Fett haben wollt, dann kriegt ihr Problem, weil an der Stelle müsstet ihr erst wieder auf 0 setzen und dann anschließend wieder die Parameter setzen. Es geht, es sind auch weniger Zeilen, aber ich finde es so sauberer.

Am Ende sollte der Prompt so ähnlich aussehen:

Den Prompt dauerhaft speichern

Um den Prompt dauerhaft zu speichern müssen wir unsere .bashrc bearbeiten. Die .bashrc findet ihr bei euch im Home-Ordner.
Öffnet einen Terminal.
Tippt folgendes ein:

cd ~/ && nano .bashrc

Bewegt euch dort zum Ende der Datei und schreibt dort einfach folgendes hin:

PS1='[Eure Konfiguration]‘

Eure Konfiguration müsst ihr natürlich mit eurer Konfiguration vertauschen, wenn ihr meine übernehmen wollt dann schreibt folgendes ans Ende der Datei:

PS1=’\[\e[34;1m\][\[\e[0m\]\[\e[35;1m\]\t\[\e[0m\]\[\e[34;1m\]:\[\e[0m\]\[\e[31;1m\]\u\[\e[0m\]\[\e[31;1m\]@\[\e[0m\]\[\e[32m\]\w\[\e[0m\]\[\e[34;1m\]]\[\e[0m\]‘

Wenn ihr euch die Datei anseht dann findet ihr dort bereits eine Promptkonfiguration, diese überschreiben wir mit der zuvor erklärten Technik einfach. Das bringt uns den Vorteil, dass wenn uns der Prompt nicht mehr gefällt, wir ganz leicht wieder zum Standard Prompt zurückkehren können.

6 Gedanken zu „Prompt anpassen und einfärben

  1. cypher

    Bei mir funktionieren die Befehle nur wenn ich die Hochkommata durch Anführungsstriche ersetze.

    Also

    PS1=“\[\e[34;1m\][\[\e[0m\]\[\e[35;1m\]\t\[\e[0m\]\[\e[34;1m\]:\[\e[0m\]\[\e[31;1m\]\u\[\e[0m\]\[\e[31;1m\]@\[\e[0m\]\[\e[32m\]\w\[\e[0m\]\[\e[34;1m\]]\[\e[0m\]“

    und nicht

    PS1=’\[\e[34;1m\][\[\e[0m\]\[\e[35;1m\]\t\[\e[0m\]\[\e[34;1m\]:\[\e[0m\]\[\e[31;1m\]\u\[\e[0m\]\[\e[31;1m\]@\[\e[0m\]\[\e[32m\]\w\[\e[0m\]\[\e[34;1m\]]\[\e[0m\]‘

    Gruss, cypher

  2. Dragonclaw

    Danke,

    denn nun kann ich endlich die Zeit im Auge behalten. Wobei, mit den Farben ich es so einstellen kann, das es lust bereitet zu arbeiten.
    Klein aber fein Dein Tutorial 🙂

  3. sassir

    Hallo,
    bei mir sieht der Prompt wie folgt aus:

    PS1=’\[33[00;36m\]\u33[00;32m@33[00;31m\h\[33[01;34m\] \w\[33[01;33m\]$(__git_ps1)\[33[01;34m\] \$\[33[00m\] ‚

    ich habe allerdings folgendes Problem.
    Bie langen Commandos bzw. wenn ich in einem ausreichend „tiefen“ Ordner bin und einen Befhel eingebe beginnen die Zeichen wieder am linken Fenster-Rand des Terminal-Fensters zu erscheinen und überschrieben quasi nach und nach meinen usernamen und den hostnamen.
    Wie kann ich es einrichten, dass solche langen commandos in einer anderen Zeile fortgeführt werden, statt in der aktuellen quasi vom anderen Fenster-Rand anfangend weiter gehen.
    Das Problem ist wenn ich dann einen alten Befehl her holen will erscheint dieser irgendwei versetzt und das ganze wird dann ziemlich unübersichtlich.

    Vielen DAnk im Voraus!

  4. sassir

    Hallo nochmal,
    nachdem ich ein paar Fehler (Escape-Character hat gefehlt) herausgenommen habe und es an die von Dir beschriebene Notation (noch nicht 100%) angepasst habe gibt es bei langen Kommandos jetzt doch einen Zeilenumbruch.

    Das Prompt sieht jetzt so aus:
    PS1=’\[\e[36m\]\u\[\e[0m\]\[\e[32m\]@\[\e[0m\]\[\e[31m\]\h\[\e[1m\]\[\e[33m\] \w\[\e[1m\]$(__git_ps1)\[\e[01;34m\] \$\[\e[00m\] ‚

    In sofern vielen Dank für die Informationen/das Tutorial auf Deiner Seite 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.