Programmierpraktikum SoSe 2024, Bachelor Informatik, FU Berlin
ProPra2024 > Basis > Repo > Shellprompt

Ein hilfreicher Prompt für unsere Shell

Product

Ziel

Ich habe in meiner Shell einen informativen Prompt, der die Orientierung in meinen Terminalfenstern erleichtert.

Hintergrund

Um anzuzeigen, dass (und wo) man nun ein Kommando eingeben kann, zeigt eine Shell einen String an, den man "Prompt" ("Aufforderung") nennt.

Wenn man nach Ausführung eines Shellkommandos, das eine längere Ausgabe macht, den Anfang dieser Ausgabe finden möchte, muss man also seinen letzten Prompt suchen. Dafür ist es hilfreich, wenn dieser recht auffällig ist, insbesondere farblich.

Wenn man mehrere Shells offen hat, verliert man ferner leicht die Übersicht, was wo ist. Deshalb ist es hilfreich, wenn der Prompt darüber Auskunft gibt.

Detailed

Arbeitsschritte

Prompt einstellen

Führen Sie in Ihrer Shell folgenden Befehl aus:

1
export PS1="\[\e[1;33m\]\u\[\e[1;31m\]@\h \[\e[0;32m\]\w \[\e[0;37m\]\t \[\e[44m\] \! \[\e[40m\]\n\$ "

Obiges erzeugt einen Prompt, der für schwarzen Terminal-Hintergrund konzipiert ist. Für einen weißen sollte man z.B. das "33m" auch durch "31m" ersetzen. Er benutzt pro Promptausgabe zwei Zeilen, um eine ungestörte Eingabe zu erlauben.

Prompt verstehen

Der Prompt hat folgende Elemente:

  • Benutzername und Hostname:
    Die sind wichtig zur Orientierung, sobald man im Bereich Systemadministration unterwegs ist.
  • Aktuelles Verzeichnis:
    Sehr oft wichtig, weil man das im normalen Leben oft ändert (im ProPra vergleichsweise selten).
  • Genaue Uhrzeit:
    Dadurch kann man bei langlaufenden Kommandos nachvollziehen, wie lange sie gedauert haben. Wenn die Ausgaben-Historie des Terminals lang genug ist, kann man damit Kommandos nachvollziehen, die z.B. vor gewissen Commits stattgefunden haben oder die zur Erzeugung einer bestimmten Datei geführt haben.
  • Kommandonummer:
    Eine fortlaufende Nummer. Die Shell kann mittels history 30 die letzten z.B. 30 Kommandos anzeigen. Wenn man wissen will, welche Ausgabe eines davon gehabt hat, hilft die Kommandonummer im Prompt, die entsprechende Stelle in der Historie zügig wiederzufinden.

Außerdem benutzt der Prompt vier verschiedene Farben. Das hat den Effekt, dass er eine charakteristische visuelle Signatur hat, die man beim Rückwärtsrollen schnell und verlässlich entdeckt, sodass das Finden der einzelnen Abschnitte der Ausgabe wenig anstrengend ist.

Prompt selber bauen

Sie dürfen Ihren Prompt gern nach Geschmack umbauen, was die Elemente, ihre Reihenfolge und die Farbgestaltung angeht.

Dazu können Sie entweder in einer kurzen oder einer ausführlichen Anleitung nachlesen, was die einzelnen Elemente bedeuten. Oder Sie benutzen einen interaktiven "Prompt Builder", etwa den von Giles Orr oder einen anderen.

Warnung:

Die genaue Anzeige der Farben hängt vom verwendeten Terminal (und u.U. dessen Einstellungen) ab. Das Thema ist leider ziemlich kompliziert. Versuchen Sie also besser kein Finetuning.

Sie können damit ruhig expermentieren und eigene Anpassungen vornehmen. Sollte etwas schiefgehen, können Sie Ihre Shell einfach schließen und wieder öffnen, um die Situation von davor zu haben.

Falls Sie sich einen eigenen Prompt bauen, behalten Sie bitte mindestens folgende Elemente des obigen Vorschlags bei, um den Tutor_innen die Arbeit zu erleichtern:

  • Benutzername
  • aktuelles Verzeichnis
  • Uhrzeit (24h-Format, mit Sekunden)
  • Kommandonummer
  • mindestens zwei verschiedene Farben
  • mindestens einen auffällig massivfarbenen Block

Der Prompt sollte ordentlich mit dunklem Bildschirmhintergrund funktionieren, auch wenn Sie selbst vielleicht einen hellen einsetzen.

Prompt persistieren

Sollten Sie einen Prompt haben, mit dem Sie zufrieden sind, sorgen Sie dafür, dass er auch für neue Shell-Instanzen verwendet wird. Hierfür führen Sie folgende Befehle aus.

1
2
echo "" > ~/.bashrc
echo "export PS1=\"\\[\\e...\"" > ~/.bashrc
Warnung:

Für das echo "export PS1" stehen wir vor einem klassischen Problem in der Software-Entwicklung: Strings in Strings. Das übliche Vorgehen wird auch hier verwendet: Setzen Sie zunächst ein zusätzliches Backslash vor alle vorhandenen (also "[" wird "\[") und zusätzlich um die Stringseparatoren von dem Wert für PS1 (also PS1="…" statt PS1=""). Anschließend Werden Anführungszeichen um den gesamten Teil gesetzt (also "export PS1=…").

Sie können den zweiten Befehl ohne das abschließende > ~/.bashrc ausführen, um zu überprüfen, ob Ihre Anpassung korrekt ist. Es sollte exakt derselbe Text ausgegeben werden, mit dem Sie ihren Prompt angepasst haben.

Falls noch nicht aktiv, aktivieren Sie den neuen Prompt durch Aufruf von source ~/.bashrc.

Reflection

Abgabe

Geben Sie eine Markdown-Datei ab. Begründen Sie entweder, warum Sie sich gegen ein Umbauen des vorgegebenen Prompts entschieden haben, oder, wie ihr eigener Prompt aussieht und warum.

Hintergrund

Es geht noch mehr

Da man in den Prompt auch Aufrufe beliebiger Kommandos einstreuen kann, ist es auch z.B. möglich, den Status des Git-Repos anzuzeigen, etwa den aktuell benutzten Zweig.

Ein passendes Skript gibt es beispielsweise direkt bei git.

Nachteile solcher Lösungen sind, dass sie den Prompt noch schwerer verständlich machen, die Konfiguration der Shell komplizierter und viel schwerer verständlich machen, hin und wieder kaputtgehen und bei jedem einzelnen Kommando den Prompt verlangsamen.