ubuntuusers.de

Prompt

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Wiki/Icons/terminal.pngDieser Artikel beschreibt, wie man mit wenigen Handgriffen die Shell Bash bzw. den Prompt, (🇩🇪: Eingabeaufforderung) der Shell etwas persönlicher gestaltet als mit dem gewöhnlichen Text "<benutzer>@<rechner>:~$". Dies gilt natürlich auch bei Verwendung einer grafischen Oberfläche für den Prompt im Terminal [1].

Ein persönlicher Prompt kann die Übersichtlichkeit fördern und Daten wie Temperaturen oder Lüfterdrehzahlen beinhalten. Der Prompt kann aber auch in eine einfache Zeichenkette geändert werden. Um dem Prompt noch etwas mehr Persönlichkeit zu geben, wird beschrieben, wie mit Farben gearbeitet wird. Dies kann ebenfalls zur Übersichtlichkeit beitragen oder nur schön aussehen.

Zeichenkette

Der Prompt wird in der Variable PS1 gespeichert [2]. Diese kann man mit

echo $PS1 

auslesen. Als Standard ist

${debian_chroot:+($debian_chroot)}\u@\h:\w\$

eingetragen. Was die einzelnen Befehle und Zeichen bedeuten, wird später beschrieben. Da es sich um eine Umgebungsvariable handelt, kann diese auch überschrieben werden. Dies geschieht in einem ganz einfachen Fall mit mit einer Zeichenkette.

PS1='> ' 

Danach ist der Prompt nur noch das Relationszeichen ">" plus eine Leerstelle. Es können aber auch Ausgaben von allen Befehlen in den Prompt mit einbezogen werden.

PS1='$(pwd) > ' 

So wird das aktuelle Verzeichnis gefolgt von dem Relationszeichen angezeigt. Neben den Befehlen gibt es eine Reihe von Variablen, die benutzt werden können:

Variable Ausgabe
\a das ASCII bell Zeichen (07)
\A Uhrzeit im 24-Stunden Format (hh:mm)
\d Datum in "Wochentag Monat Tag" z.B., "Mit Mai 26")
\e ASCII escape Zeichen (033)
\h Hostname auf dem die Shell läuft bis zum ersten "."
\H Hostname komplett
\j Anzahl der Jobs in der Shell
\l Das tty, auf dem die Shell läuft
\n Neue Zeile
\t Uhrzeit im 24-Stunden Format (hh:mm:ss)
\T Uhrzeit im 12-Stunden Format (hh:mm:ss)
\r carriage return
\s Name der verwendeten Shell (sh, bash, ..)
\u Name des Nutzers, der die Shell gestartet hat
\v Version der bash (z.B. 2.00)
\V Release der bash, Version, Patchlevel
\w momentanes Arbeitsverzeichnis
\W letzte Komponente des Arbeitsverzeichnisses
\! Aktuelle History-Nummer
\# Aktuelle Befehls-Nummer
\$ Wenn root ein "#", sonst ein "$"
\\ Backslash
\nnn Zeichen entsprechend der oktalen Zahl nnn
\[ Beginn einer Sequenz von nicht-darstellbaren Zeichen
\] Ende einer Sequenz von nicht-darstellbaren Zeichen
\@ Aktuelle Zeit im 12-Stunden am/pm Format

Die Ausgabe von "Uhrzeit user@rechner verzeichnis history-nummer >" wird erzeugt durch

PS1='\A \u@\h \W \! >' 

Diese Standard-Escape-Zeichen und Befehle kann man beliebig komplex schachteln. Zusätzlich können ganz normale alphanumerische Zeichen eingebaut werden.

Länge begrenzen

Befindet man sich tief in der Verzeichnishierarchie kann der Standardprompt unübersichtlich lang werden. Man kann die Anzahl der ausgegebenen Verzeichnisse durch Setzen der Variable PROMPT_DIRTRIM begrenzen. Abgeschnittene Teile des Pfads werden dann durch Ellipsen (Auslassungspünktchen) gekennzeichnet. Folgender Befehl begrenzt die Ausgabe auf vier Verzeichnisse:

PROMPT_DIRTRIM=4 

Farben

Um den neu erstellten Prompt optisch noch ansprechender zu gestalten und nicht nur mit Informationen zu füttern, können Farben verwendet werden. Farbcodierungen werden dafür in den String zum Setzen der PS1-Variable eingebaut. Farben ergeben durchaus Sinn und helfen die Übersichtlichkeit zu steigern, sofern man es nicht übertreibt. Um Interpretationsfehler seitens der Shell bei den Farben zu vermeiden, werden sie durch \[ am Anfang und \] am Ende begrenzt. In dieser Eingrenzung werden Terminal-Kontroll-Sequenzen angegeben, welche mit \033[ beginnen und auf m enden. Eine Farbdefinition behält solange ihre Gültigkeit, bis eine neue folgt. Die letzte angegebene Farbe ist die, in der auch die Benutzereingaben erfolgen.

Sequenz Farbe
\[\033[0;30m\] schwarz
\[\033[1;30m\] dunkelgrau
\[\033[0;31m\] rot
\[\033[1;31m\] helles rot
\[\033[0;32m\] grün
\[\033[1;32m\] hellgrün
\[\033[0;33m\] braun
\[\033[1;33m\] gelb
\[\033[0;34m\] blau
\[\033[1;34m\] hellblau
\[\033[0;35m\] dunkellila
\[\033[1;35m\] helllila
\[\033[0;36m\] Dunkeltürkis
\[\033[1;36m\] Türkis
\[\033[0;37m\] Hellgrau
\[\033[1;37m\] weiß
\[\033[0m\] farblos

Falls man die Hintergrundfarbe verändern möchte, findet man die entsprechenden Escape-Sequenzen hier:

Sequenz Hintergrundfarbe
\[\033[XXm\] Keine Hintergrundfarbe
\[\033[40;XXm\] Schwarzer Hintergrund
\[\033[41;XXm\] Roter Hintergrund
\[\033[42;XXm\] Grüner Hintergrund
\[\033[43;XXm\] Hellbrauner Hintergrund
\[\033[44;XXm\] Blauer Hintergrund
\[\033[45;XXm\] Lila Hintergrund
\[\033[46;XXm\] Türkis Hintergrund
\[\033[47;XXm\] Hellgrau Hintergrund

Dies kann man jetzt alles kombinieren, jedoch werden die PS1-Variablen schnell sehr unübersichtlich.

PS1='\[\033[1;33m\]\t\[\033[0;32m\] \u > ' 

erzeugt diese Ausgabe

Uhrzeit_in hh:mm:ss user >

Änderungen speichern

Damit die Änderungen dauerhaft sind, müssen diese gespeichert werden. Für den aktuellen Benutzer geschieht dies in seinem Homeverzeichnis. Dort wird die Datei ~/.bashrc geöffnet und an das Ende wird der String PS1='meinPrompt' angefügt [3]. Nun muss man sich lediglich neu anmelden, damit die veränderte Datei eingelesen wird. Soll ein Prompt für alle Benutzer eines Systems gelten, so wird der Eintrag zur PS1-Variable in der Datei /etc/bash.bashrc angepasst (wird aber bei 10.4 von der ~/.bashrc überschrieben). Auch hier ist ein Ab- und anschließendes Anmelden nötig, um die Änderungen wirksam zu machen. Alternativ kann man die Änderungen an der .bashrc auch mittels folgendem Befehl neu einlesen

source ~/.bashrc 

Beispiele

Abschließend sind hier einige Beispiele für verschiedene Prompts zusammengestellt.

Beispiel 1

PS1='\[\033[0;32;40m\]\u@\H:\e[0m ' 
user@rechner

Beispiel 2

PS1='\[\033[1;34;40m[\033[1;31;40m\u@\h:\w\033[1;34;40m]\033[1;37;40m $\033[0;37;0m\] ' 
username@rechnername:verzeichnis $

Beispiel 3

PS1='\s\v \[\e[31m\]User \[\e[34m\]\u \[\e[31m\]on host \[\e[34m\]\h\[\e[31m\] in dir \[\e[34m\]\w\n\d \t> \[\e[37m\] ' 
shell-name version User username on host rechnername in dir verzeichnis
wochentag monat hh:mm:ss>

Beispiel 4

PS1='\[\033[1;73m\][$(date +%H:%M:%S)]\[\033[1;36m\][\[\033[1;34m\]\u\[\033[1;33m\]@\[\033[1;32m\]\h:\[\033[1;35m\]\w\[\033[1;36m\]]\[\033[1;31m\]\\$\[\033[0m\] ' 
hh:mm:ss username @ rechnername: verzeichnis $

Beispiel 5

Daten z.B. über das System können direkt in der .bashrc eingebunden werden:

KERNEL=$(uname -r)
PS1=''"$KERNEL"'@\h:\w\$ ' 

Beispiel 6

Sich ständig ändernde Daten einzubinden, ist etwas komplizierter. Wenn man im Prompt eine Anzeige über den aktuellen Ladestand seines Akkus haben möchte, erstellt man zuerst mit einem Editor ein Skript .battery.bash im Homeverzeichnis des Benutzers, das den Ladestand berechnet und ausgibt [3]. Anschließend wird die Ausgabe dieses Skripts in den Prompt integriert.

In der Datei ~/.battery.bash müssen ggf. die Verzeichnisse für BATTERY_DIR und AC_DIR angepasst werden.

#!/bin/bash
BATTERY_DIR=/proc/acpi/battery/BAT1
AC_DIR=/proc/acpi/ac_adapter/ADP1

if grep -q 'last full capacity' ${BATTERY_DIR}/info ; then
        FULL_BATTERY=$( awk '/last full capacity/ {print $4}' ${BATTERY_DIR}/info )
        CURRENT_BATTERY=$( awk '/remaining capacity/ {print $3}' ${BATTERY_DIR}/state )
        PERCENT=$(( ${CURRENT_BATTERY} * 100 / ${FULL_BATTERY} ))
        if grep -q on-line ${AC_DIR}/state; then
                echo "Netz $PERCENT%"
        else
                echo "Akku $PERCENT%"
        fi
else
        echo "Ohne Akku"
fi

Dem gespeicherten Skript werden nun Ausführungsrechte verliehen [4]:

chmod u+x ~/.battery.bash 

Die Einbindung in den Prompt erfolgt z. B. über

PS1='\u@\h:\w_$(~/.battery.bash)\$ ' 

Es werden drei unterschiedliche Ausgaben erzeugt. Im reinen Akkubetrieb

username@rechnername:verzeichnis_Akku98% 

Wenn sowohl Akku als auch Netzteil angeschlossen sind

username@rechnername:verzeichnis_Netz98% 

Und im reinen Netzbetrieb

username@rechnername:verzeichnis_OhneAkku 

Diese Revision wurde am 23. Juli 2020 23:56 von chris34 erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Shell