Nov. 19, 2009

Bash-Prompt

Mal ein neuer Post zu praktischen Bash-Prompts, nachdem ich den alten doch wieder um einiges überarbeitet habe.

Ziele:

  • Übersichtlichkeit
  • Möglichst lange Eingabezeilen ohne Umbruch
  • Prompt soll auf verschiedenen Hosts unterscheidbar sein
  • Der Prompt soll möglichst informativ sein.
Lösung:
  • Zweizeiliger Prompt, eine Zeile mit vielen Informationen, eine mit nur einem > und der Eingabe dahinter.
  • Username und Hostname Farbkodiert, geschieht automatisch ueber eine Hashing-Funktion
  • Zeitausgabe ermöglicht es einfach zu sehen wann der Befehl beendet wurde, und damit auch wie lange er gebraucht hat.
  • Smiley in der Ausgabe zeigt ob der Befehl korrekt gelaufen ist (Return Code 0 = kein Fehler)
Um Farben aus hostname/username zu generieren, kann man einfach md5sum als hash-Funktion nutzen, und dann das erste Byte der md5summe ansehen. Das tut die Funktion hashcolor in meiner .bashrc. Dabei habe ich mir noch die Freiheit genommen, die Farben so zu sortieren, dass der Text  "root" eine Rote Farbe bekommt.

die Umgebungsvariable PROMPT_COMMAND darf einen Befehl enthalten, der ist in dem Falle die Funktion Prompt, welche auf der Linux-Konsole nur setps1 aufruft um den Prompt zu ändern, und in X-Terminals aber auch settitle und mittels Escape-Code den Titel des Fensters auf das letzte genutzte Kommando zu setyen.

Der Prompt sieht bei mir jetzt so aus:

12:59:56 :-) username@hostname:~

>

Die .bashrc dazu:
# If running interactively, then:
if [ "$PS1" ]; then
    ## aendert den xterm-Titel in das zuletzt benutzte Kommando usw.
    xtitle() {
        echo -ne "\033]0;[$(history 1 | cut -b 8-30)] $USER@$HOSTNAME:$PWD\007";
    }
    setps1() {
        if [ $? -eq 0 ];then smiley=":-)"; else smiley=":-(";fi
        export PS1="\t $smiley \[`hashcolor $USER`\]\u\[$grey\]@\[`hashcolor $HOSTNAME`\]\H\[$grey\]:\[$yellow\]\w\n\[$normal\]> "
    }
    if [ "${TERM}" != "linux" ]; then
        prompt() {
            setps1
            xtitle
        }
    else
        prompt() {
            setps1
        }
    fi
    PROMPT_COMMAND='prompt'
fi

normal='\e[0m' black='\e[0;30m' bblack='\e[1;30m' red='\e[0;31m' bred='\e[1;31m' green='\e[0;32m' bgreen='\e[1;32m' yellow='\e[0;33m' byellow='\e[1;33m' blue='\e[0;34m' bblue='\e[1;34m' purple='\e[0;35m' bpurple='\e[1;35m' blue2='\e[0;36m' bblue2='\e[1;36m' white='\e[0;37m' bwhite='\e[1;37m' grey='\e[0;39m' bgrey='\e[1;39m'

bgnorm='\e[0;0m' bgblack='\e[0;40m' bgred='\e[0;41m' bggreen='\e[0;42m' bgyellow='\e[0;43m' bgblue='\e[0;44m' bgpurple='\e[0;45m' bgblue2='\e[0;46m' bggrey='\e[0;47m'

function hashcolor { case $(echo $1|md5sum|cut -b 1) in 0)echo -en $red;; 1)echo -en $bblue;; 2)echo -en $green;; 3)echo -en $bgrey;; 4)echo -en $yellow;; 5)echo -en $byellow;; 6)echo -en $blue;; 7)echo -en $bred;; 8)echo -en $purple;; 9)echo -en $bpurple;; a)echo -en $blue2;; b)echo -en $bblue2;; c)echo -en $grey;; d)echo -en $bgreen;; e)echo -en $white;; f)echo -en $bwhite;; esac }

Die interessanten Manpages zu dem Thema sind:
  • man console_codes erklärt die Escape Codes z.B. für Farben oder auch um den Titel eines X-Terminals zu ändern.
  • man bash erklärt, dass man Farbcodes in \[...\] einschliessen sollte, damit sie den Zeilenumbruch im Prompt nicht kaputt machen.

Kategorien Software Linux
Tagged Bash Prompt color farben

3 Kommentare

Kommentare
März 31, 2010 12:04 - Florian

hallo, kleiner Tipp am Rande: ich würde kein ">" in einem Prompt verwenden. Benutzt man nämlich den Mauspuffer, um alte Zeilen zu kopieren, kann es passieren, dass man aus Versehen das ">" aus dem Prompt mitnimmt (ist einem Kollegen mal passiert). Effekt: PROMPT > ./pfad/zu/meinem/skript Markieren -> mit mittlerer Maustaste einfügen -> ausführen (gegebenfalls automatisch, falls das Newline mitkopiert wird) -> das ">" wird von der Shell als Pipe interpretiert und PROMPT wird in dein Skript geschrieben, bzw. das Skript wird gelöscht. Viele Grüße, Florian

April 1, 2010 18:12 - laxu

Je nach Terminal kann man die Zeichen, die mitkopiert werden und wo die Markiergrenze ist einstellen. Aber es kann natürlich jeder seine Promptzeichen setzen wie er will, soll hier ja nur mal eine Anregung sein :).

Juni 3, 2010 16:48 - Nim

mein Prompt ist vglw. ähnlich, ich benutz dazu noch eine lange Trennlinie: -------------------------------------------------------------------------------- 501 16:29:46 andre ~/downloads $


Kommentar schreiben