/etc/skel/.bashrc

Publié le 09/01/2015

What the skel?

Le répertoire /etc/skel/ contient les fichiers par défaut qui seront copiés lorsqu'un nouvel utilisateur sera créé. Sur ma ch'tite Fedora adorée, ce dossier contient déjà les fichiers suivants :

  • .bash_profile, utilis√© lorsque l'utilisateur se connecte via un tty
  • .bashrc, utilis√© lorsque l'utilisateur lance connexion √† un terminal depuis une session d√©j√† authentifi√©e.
  • .bash_logout, vide (ouaip, par d√©faut, il ne se passe rien; mais la modification de ce fichier permettrait d'ex√©cuter un certain nombre d'actions lorsque l'utilisateur se d√©connecte)

Sur Antergos par contre, le dossier est complètement vide. On va remplir tout ça.

Message d'accueil

Pour que bash vous souhaite la bienvenue à l'ouverture, passez par fortune-mod. C'est une application présente sur la plupart des distributions, et qui sort un ensemble de citations de manière aléatoire. Par contre, l'installation de plugins supplémentaires (genre Calvin & Hobbes ou Chuck Norris) nécessitera peut-être de passer par une installation manuelle. Sous Arch, il y a les Arch User Repositories :)

sudo yaourt -S fortune-mod fortune-mod-calvin

fred@gaw ~/Sources $ fortune
The more I know men the more I like my horse.

fred@gaw ~/Sources $ fortune calvin
Calvin: I think we have got enough information now, don't you?
Hobbes: All we have is one "fact" that you made up.
Calvin: That's plenty. By the time we add an introduction, a few
		illustrations and a conclusion, it'll look like a graduate
		thesis.

Après, il suffit d'ajouter fortune calvin (ou le mod choisi) au début du fichier .bashrc. On peut également ajouter un appel à cowsay ou cowthink avec un pipe depuis fortune, et on aura un beau message de login.

Bref, dans le fichier .bashrc, cela revient à ajouter ceci :

if [ -x /usr/bin/fortune ]; then
	fortune calvin
fi

On teste que fortune existe, et si oui, on le lance au démarrage de la session du shell.

Quelques couleurs et informations

Ce fichier, c'est d'abord l'emplacement pour associer un peu de couleurs au shell, en redéfinissant la variable $PS1. Le wiki d'ArchLinux est assez complet à ce sujet. Ma config' préférée reste cependant celle héritée de Gentoo:

if [[ ${EUID} == 0 ]] ; then
	PS1='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
else
	PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] '
fi

Comme cette condition vérifie si l'utilisateur courant est root ou non, il convient de la placer dans le bashrc global, et non au niveau de l'utilisateur courant. L'emplacement de ce fichier-ci dépend vraiment de la distribution. Sous Arch par exemple, il se trouve dans /etc/bash.bashrc.

Un autre truc intéressant, c'est de pouvoir afficher la branche git sur laquelle on travaille, ainsi que l'environnement virtuel dans lequel on se trouve. Il existe normalement un fichier de complétion pour le shell, mais je n'ai pas réussi à le faire fonctionner. Du coup, j'ai trouvé une autre solution. En combinant avec la variable $PS1 précédente, cela revient à ceci :

parse_git_branch() {
	git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "

Pour les environnements virtuels en Python, il suffit de passer par virtualenvwrapper.

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Sources
source /usr/bin/virtualenvwrapper.sh

Le nom de l'environnement s'ajoutera automatiquement au début de la ligne.

Quelques fonctions utiles

Bref, si on veut avoir un ensemble de fonctions prête-à-utiliser, c'est le bon emplacement. Par exemple sur SamEtMax, on trouve un article intitulé à l'intérieur de mon bashrc. Parmi les quelques fonctions exprimées, on trouve par exemple:

extract () {
if [ -f $1 ]
	then
		case $1 in
			(*.7z) 7z x $1 ;;
			(*.lzma) unlzma $1 ;;
			(*.rar) unrar x $1 ;;
			(*.tar) tar xvf $1 ;;
			(*.tar.bz2) tar xvjf $1 ;;
			(*.bz2) bunzip2 $1 ;;
			(*.tar.gz) tar xvzf $1 ;;
			(*.gz) gunzip $1 ;;
			(*.tar.xz) tar Jxvf $1 ;;
			(*.xz) xz -d $1 ;;
			(*.tbz2) tar xvjf $1 ;;
			(*.tgz) tar xvzf $1 ;;
			(*.zip) unzip $1 ;;
			(*.Z) uncompress ;;
			(*) echo "don't know how to extract '$1'..." ;;
		esac
	else
		echo "Error: '$1' is not a valid file!"
		exit 0
	fi
}

Conclusion

Au final, mon fichier .bashrc ressemble à ceci:

if [ -x /usr/bin/fortune ]; then
	fortune calvin
fi

parse_git_branch() {
	git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

export PS1="\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\e[0;31m\]\$(parse_git_branch)\[\033[00m\] $ "

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Sources
source /usr/bin/virtualenvwrapper.sh

Et des fois que je me connecte en root, j'ai ajouté ceci dans le fichier /etc/bash.bashrc:

if [[ ${EUID} == 0 ]] ; then
	PS1='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] '
fi

Le contenu du fichier .bash_profile est assez simple. En résumé, il va vérifier si un fichier .bashrc existe (ou non) et le charger.

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH

Sources

  • http://sphericalcow.wordpress.com/2009/04/05/bashrc-by-example/
  • http://www.linfo.org/etc_skel.html
  • http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html