Under Construction

Der Shell-Prompt

Jede Shell verwendet eine visuelle Eingabeaufforderung, den sogenannten Prompt oder Shell-Prompt, um dem Benutzer zu signalisieren, das die Shell eine Eingabe des Benutzers erwartet. Startet der Benutzer eine Aktion oder ein Kommando, dann wird bei Beendigung der Aktion oder des Kommandos erneut der Shell-Prompt ausgegeben. Der Shell-Prompt ist also ständiger Begleiter des Benutzers. Standardmäßig gibt die bash den folgenden Prompt aus:

-bash-5.1$

Der Shell-Prompt kann bei der bash über die Variable PS1 angepasst werden. Wir wollen im folgenden einige Möglichkeiten der Konfiguration zeigen. Dabei werden wir uns allerdings relativ kurz fassen, da es im Netz sehr viele Beiträge zum Thema bash-Prompt zu finden sind. Insbesondere werden wir uns nicht mit farbigen Prompts beschäftigen.

Zunächst sollte man sich überlegen, welche Informationen so nützlich sind, das sie überhaupt im bash-Prompt angezeigt werden sollten. Hier einige Vorschläge:

    • Ist man als root eingeloggt, oder als normaler (nicht privilegierter Benutzer)?
    • Als welcher Benutzer arbeitet man gerade?
    • Auf welchem Rechner ist man gerade eingeloggt? Das ist gerade beim Arbeiten mit vielen Systemen wichtig, da man sonst einmal schnell das falsche Kommando auf dem falschen Rechner ausgeführt hat.
    • In welchem Verzeichnis befindet man sich gerade?
    • Wie war der Exit-Status des letzten ausgeführten Kommandos?

Wir greifen die genannten Vorschläge auf, und zeigen wie man diese umsetzt. Welche Informationen man im bash-Prompt aber dann am Ende anzeigen lässt, hängt sehr von den individuellen Bedürfnissen und dem Geschmack ab.

Unter UNIX hat es sich eingebürgert eine root-Shell mit einer Raute „#“ (Hash-Symbol) kenntlich zu machen. Für eine Bourne Shell oder davon abgeleitete Shells wird in der Regel das Dollar-Zeichen „$“ verwendet. Für eine C-Shell oder einer davon abgeleiteten Shell wird häufig das Prozent-Zeichen „%“ verwendet. Die bash bietet die Escape-Sequence „\$“, welche durch „#“ ersetzt wird, wenn der aktuelle Benutzer root ist und durch „$“ ersetzt wird, wenn der aktuelle Benutzer nicht root ist.

Man kann dies sofort ausprobieren, indem man die Variable PS1 auf „\$ „ setzt:

-bash-5.1$ PS1='\$ '
$

Für den aktuellen Benutzer-Namen gibt es die Escape-Sequence „\u“. Wir fügen den Benutzernamen am Anfang des Prompts hinzu:

$ PS1='\u \$ '
user01 $

Auf den Rechnernamen kann man über die Escape-Sequence „\h“ zugreifen. Wir lassen Benutzer und Rechner in der Form „user@host“ im Prompt ausgeben:

user01 $ PS1='\u@\h \$ '
user01@aixe01 $

Dabei steht „\h“ für den kurzen Rechnernamen, ohne Domänen. Möchte man den voll qualifizierten Rechnernamen (inklusive Domänen) ausgeben, muss man „\H“ verwenden.

Das aktuelle Arbeitsverzeichnis lässt sich über „\w“ ausgeben:

user01@aixe01 $ PS1='\u@\h \w \$ '
user01@aixe01 ~ $

Bei tief verschachteteln Verzeichnissen kann der Prompt dann aber schon etwas länger werden:

user01@aixe01 ~ $ cd /opt/freeware/src/packages/SOURCES
user01@aixe01 /opt/freeware/src/packages/SOURCES $

Wer eine kürzere Darstellung bevorzugt, kann anstelle von „\w“ für die volle Pfad-Angabe auch „\W“ verwenden. Dann wird nur die letzte Pfad-Komponente des aktuellen Verzeichnisses angezeigt:

user01@aixe01 /opt/freeware/src/packages/SOURCES $ PS1='\u@\h \W \$ '
user01@aixe01 SOURCES $

Für den Exit-Status des letzten Kommandos wird keine eigene Escape-Sequence benötigt. Dieser wird ja von der bash schon in der Variablen „$?“ abgespeichert. Allerdings muss man bei Verwendung einer Shell-Variablen in PS1 darauf achten entweder die rechte Seite in ein Paar von Apostrophen einzuschließen, so wie wir das in allen Beispielen oben gemacht haben, oder bei Verwendung von Anführungszeichen anstelle Apostroph, muss man das Dollar-Zeichen von „$?“ mit einem Backslash „\“ davor schützen direkt ausgewertet zu werden. Wir bleiben bei der Variante mit Apostroph:

user01@aixe01 SOURCES $ PS1='\u@\h \W $? \$ '
user01@aixe01 SOURCES 0 $ ls -l /does_not_exist
/does_not_exist not found
user01@aixe01 SOURCES 2 $

Da bei einem Fehler typischerweise eine Fehlermeldung ausgegeben wird und nur in seltenen Fällen der Exit-Code wirklich angeschaut wird, verzichten wir auf die Ausgabe des Exit-Codes im Prompt. Aber das ist, wie oben schon gesagt, eine Sache des Geschmacks.

Der ausgegebene Prompt und die vom Benutzer gemachte Eingabe sind optisch nicht wirklich gut getrennt. Die bash erlaubt es Fett-Druck zu verwenden (natürlich nur wenn das verwendete Terminal dies auch unterstützt).

Das Ändern der Schriftart auf Fett (Bold) kann über die Escape-Sequence „\e[1m„ erfolgen. Mit der Escape-Sequence „\e[0m“ kann die Schriftart dann wieder auf Normal zurückgesetzt werden. Wir verwenden dies und lassen unseren Prompt in Fett-Schrift ausgeben. Außerdem verpacken wir den Teil mit Benutzername, Rechnername und aktuelle Verzeichnis in sogenannte Square-Brackets („[„, „]“):

user01@aixe01 ~ 0 $ PS1='\e[1m[\u@\h \W] \$\e[0m '
[user01@aixe01 ~] $

Damit dies dauerhaft ist, muss das Setzen von PS1 in einer der Start-Dateien der bash erfolgen. Wir konfigurieren den Prompt über die Datei ~/.bashrc:

[user01@aixe01 ~] $ cat .bashrc

PS1='\e[1m[\u@\h \W] \$\e[0m '

[user01@aixe01 ~] $