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