Configurer votre prompt BASH

Date: 20/02/2012 | Catégories: Open-source,Planet-libre,Systeme | Tags: ,,

S'il y a bien une chose que nous, geeks du monde libre, regardons en longueur de journée, c'est bien notre cher prompt (vous savez: $, # ...). C'est en lisant ce billet que je me suis dit que mon prompt actuel avait besoin d'un ravalement de façade:

Je souhaite mettre un peu de couleur dans mon nouveau prompt ainsi que des informations sur le dossier en cours. Quand ce dernier est un dossier de développement sous Git, je veux afficher la branche en cours d'utilisation et aussi savoir si mon répertoire est dans l'état "staging" (c'est à dire si je dois faire un commit).

Sans plus attendre, voici un aperçu de mon nouveau prompt (version 2 lignes):

Ce dernier se décompose en deux lignes:

  • user@host:folder (je garde cette structure pour simplifier les copier/coller en SSH, puis l'état Git (avec [le nom de la branche] en couleur rouge si staging, vert sinon)
  • le prompt proprement dit (là ou l'on va taper la commande :)) précédé de $ si on est un utilisateur standard et # si root

Pour la première ligne, j'utilise la variable BASH nommé PROMPT_COMMAND qui a le gros avantage d'être exécuté à chaque fois que le prompt est affiché (pas seulement à l'initialisation). La seconde ligne utilise la variable PS1.

Pour disposer de ce prompt, il est nécessaire d'insérer le code suivant à la fin de votre fichier .bashrc (il est aussi disponible sous GitHUB):

[cc lang="bash"]

# Colors

NoColor="33[0m"

Cyan="33[0;36m"

Green="33[0;32m"

Red="33[0;31m"

Yellow="33[0;33m"

# Chars

RootPrompt="#"

NonRootPrompt="$"

# Contextual prompt

prompt() {

USERNAME=`whoami`

HOSTNAME=`hostname`

CURRENTPATH=`pwd`

LEFTPROMPT=$Cyan$USERNAME@$HOSTNAME":"$Yellow$CURRENTPATH

let LEFTSIZE=$(echo -n "$USERNAME@$HOSTNAME:$CURRENTPATH" | wc -c)

RIGHTPROMPT=""

let RIGHTSIZE=0

GITSTATUS=$(git status 2> /dev/null)

#echo $GITSTATUS > /dev/null 2>&1

if [ $? -eq 0 ]; then

echo $GITSTATUS | grep "not staged" > /dev/null 2>&1

if [ $? -eq 0 ]; then

RIGHTPROMPT=$Red

else

RIGHTPROMPT=$Green

fi

BRANCH=`git describe --contains --all HEAD`

RIGHTPROMPT=$RIGHTPROMPT"[Git branch "$BRANCH"]"

let RIGHTSIZE=$(echo -n "[Git branch "$BRANCH"]" | wc -c)

fi

let BLANCKSIZE=${COLUMNS}-${LEFTSIZE}-${RIGHTSIZE}

RIGHTPROMPT=$RIGHTPROMPT$NoColor

echo -e -n $LEFTPROMPT

printf "%$(($BLANCKSIZE))s"

echo -e $RIGHTPROMPT

}

# Main prompt

PROMPT_COMMAND=prompt

if [ $EUID -ne 0 ]; then

PS1=$NonRootPrompt" "

else

PS1=$RootPrompt" "

fi

[/cc]

Update (20/02/2012): Je viens également d'ajouter une version allégée (en une seule ligne) de ce prompt. Le fichier de configuration BASH correspondant se trouve ici.

Update (21/02/2012): David Olivier vient de modifier  le script (version deux lignes) pour fonctionner avec SVN. A retrouver sur le GitHub.

Et vous, comment est votre prompt ?