Bash-Prompt mit Git-Informationen

Die Bash ist die Standard-Shell unter Linux und vielen Unixen. Der Prompt ist jedoch leider meist ein wenig armselig und längst nicht so hilfreich, wie er eigentlich sein könnte. Das habe ich vor ein paar Wochen bei mir mal geändert und bin ziemlich zufrieden damit. Zunächst mal wollte ich ihn hervorheben, damit es leichter ist, Programmausgaben von Befehlseingaben zu unterscheiden. Das hilft besonders wenn man durch eine lange History durchblättern möchte:

Es gibt also einen farbig hervorgehobenen Balken mit Statusinformationen und darunter steht nur das aktuelle Verzeichnis und anschließend die Eingabe. Das hat sich bewährt und nimmt nicht viel mehr Platz weg als der Default-Prompt. Außerdem passt auch mal ein längeres Kommando in eine Zeile, wenn man tief in der Ordnerstruktur ist ;). Die angezeigten Informationen sind der Reihe nach:

  • Nutzername

  • Computername

  • Nummer der aktuellen Shell

  • Datum und Uhrzeit (nützlich, wenn man wissen will, wie lange das letzte Kommando gebraucht hat)

  • Git-Informationen (komme ich gleich noch zu)

  • aktueller Pfad

Die Git-Informationen werden von zwei kleinen Funktionen in der .bashrc erzeugt. Der folgende Beispielhafte Ablauf zeigt, was so dargestellt wird:

Zunächst ist der aktuelle Branch zu sehen. Ein * hinter dem Namen gibt an, dass es Änderungen gibt, die noch nicht commited wurden. Sobald im lokalen Repository Commits angefallen sind, die noch nicht gepushed wurden, deutet ein ↑ an, dass dies noch passieren muss. Wenn das Remote-Repository Commits hat, die man selbst noch pullen muss, wird ein ↓ angezeigt. Durch diese Hilfen spart man sich den ständigen Aufruf von ‘git status’ und ‘git branch’ während der Arbeit.

Um den eigenen Prompt so zu gestalten muss die ~/.bashrc bearbeitet werden. Zunächst müssen die Funktionen parse_git_dirty und parse_git_branch eingebaut werden. Weiter unten kann dann der Prompt über PS1=… umdefiniert werden. Das ist etwas kryptisch und nicht sonderlich gut zu lesen, es gibt aber Übersichten, mit denen man sich selbst was Hübsches zusammenbasteln kann.

[sourcecode language=“bash”] function parse_git_dirty { [[ $(git status 2> /dev/null | tail -n1) != “nothing to commit (working directory clean)” ]] && echo “*” }

function parse_git_branch { [ -d .git ] || return 1 git_status=“$(git status 2> /dev/null)” branch_pattern=“^# On branch ([^${IFS}])” remote_pattern=“# Your branch is (.) of” diverge_pattern=“# Your branch and (.) have diverged” if [[ ! ${git_status}} =~ “working directory clean” ]]; then state=”“ fi # add an else if or two here if you want to get more specific if [[ ${git_status} =~ ${remote_pattern} ]]; then if [[ ${BASH_REMATCH[1]} == “ahead” ]]; then remote=“↑” else remote=“↓” fi fi if [[ ${git_status} =~ ${diverge_pattern} ]]; then remote=“↕” fi if [[ ${git_status} =~ ${branch_pattern} ]]; then branch=${BASH_REMATCH[1]} echo “ <${branch}${state}${remote}>” fi }

PS1=’[\e[44;37m]##### \u @ \h [\l] \d \t $(parse_git_branch) #####[\e[0;0m]\n\w \$ ‘ [/sourcecode] Die Geschichte mit den Git-Funktionen habe ich mir nicht selbst ausgedacht sondern auf Github gibt es einige Gists, die sich dem Problem auf verschiedene Herangehensweisen nähern. Ich hatte mich dann mal für irgendeine dieser Versionen entschieden, die ich aber gerade nicht wieder finde. Vielleicht gibt es da sogar mittlerweile was viel eleganteres… Außerdem kommen die Git-Informationen bei diesen Funktionen nur im Root des Git-Repository was ich gut finde, da sich mein ~ unter Versionsverwaltung befindet und ich sonst sicher verwirrt wäre. Kann man natürlich auch ausschalten, wenn man das will.