Configurer votre prompt BASH
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):
NoColor="\\033[0m"
Cyan="\\033[0;36m"
Green="\\033[0;32m"
Red="\\033[0;31m"
Yellow="\\033[0;33m"
# Chars
RootPrompt="#"
NonRootPrompt="$"
# Contextual prompt
prompt() {
USERNAME=<code>whoami</code>
HOSTNAME=<code>hostname</code>
CURRENTPATH=<code>pwd</code>
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=<code>git describe --contains --all HEAD</code>
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
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 ?