Copyright © 2009 Ben Okopnik
Copyright © 2010 Eric Deschamps
Copyright © 2010 Gaël Montreuil
Article paru dans le n°161 de la Gazette Linux d'avril 2009.
Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.
Table des matières
[ À partir d'un fragment moisi d'anciennes écritures découvertes parmi les moutons de poussière dans une salle serveur abandonnée ]
"...Et quand Ubuntu fit son apparition, tout le monde fut enchanté par sa jolie interface graphique, son système « dpkg » de paquetage toujours fiable, sa communauté ouverte aux débutants, etc., tout était parfait. Mais voilà, vinrent les jours plus sombres et les découvertes : ceux qui avaient, dans des temps reculés, définis leurs variables d'environnement et leur configuration dans leur ~/.bash_profile découvrirent soudainement que ce fichier n'était plus pris en compte. Pire, ils se rendirent compte que les merveilleux forums d'utilisateurs d'Ubuntu ne leur étaient d'aucun secours. Dans ces deniers jours retentit un cri "Mec ! QU'EST-IL ARRIVÉ À MES FICHIERS DE CONF ?".
Avec un peu de chance, cet article répondra à cette question, et vous dira peut-être comment faire.
Au tout début, l'utilisation de Bash sous X était simple et prévisible. À la fin du démarrage système, le dernier runlevel, au choix :
vous présentait une console de connexion, qui lançait votre shell de connexion et lisait tous les fichiers d'initialisation, après quoi vous pouviez lancer X ;
lançait un gestionnaire d'affichage, qui lançait X, un shell de connexion (qui lisait ses propres fichiers d'initialisation), et passait la main à vos ~/.xinitrc
ou ~/.xsession
, où vous pouviez mettre toutes les configurations que vous souhaitiez pour X, vos programmes et votre gestionnaire de bureau. Beaucoup de flexibilité, une foule de choix possibles, même si ce dernier point semait la confusion pour les nouveaux utilisateurs de Linux, tout était parfait.
Mais Ubuntu s'y est pris différemment : le runlevel passe le contrôle au gestionnaire de session GDM (Gnome Display Manager), qui lance votre gestionnaire de bureau (GNOME) et... c'est à peu près tout. Bien-sûr, c'est plus simple pour les nouveaux utilisateurs, mais vous perdez le contrôle du comportement du shell ; en fait, il n'y a plus de shell de connexion, ce qui signifie que les fichiers de configuration utilisateurs ne sont plus lus à la connexion. De même il n'y a plus de moyen standard pour lire une configuration spécifique au lancement de X. Que faire ?
Lorsque j'ai migré vers Ubuntu, j'ai trouvé cette situation désagréable mais je l'ai gérée de différentes façons, essentiellement en bricolant en tant que root et en triturant la magie opaque de GDM, rien que je recommanderais à un nouvel utilisateur puisque c'est un excellent moyen pour ne plus pouvoir démarrer votre système. Récemment, je me suis décidé à regarder si je ne pouvais pas trouver une solution accessible à l'utilisateur moyen.
J'ai commencé par tracer l'exécution des scripts de démarrage de X dans /etc/X11
et /etc/gdm
; en gros, on commence par lire le fichier Xession
qui paramètre les variables et charge les fichiers externes, puis le gestionnaire d'affichage défini dans /etc/X11/default-display-manager
(gdm) prend la main. Ensuite GDM lance sa propre version de Xsession
(/etc/gdm/Xsession
) qui lit les scripts de /etc/X11/Xsession.d/
et rend la main, et ainsi de suite. En suivant ce processus, j'ai remarqué que /etc/gdm/Xsession
lisait un fichier nommé $HOME/.xprofile
. Bingo, un fichier modifiable par l'utilisateur ! Mais il y avait un piège : le shebang (NDLR: définition de l'interpréteur de commandes) de /etc/gdm/Xsession
étant « #!/bin/sh », le .xprofile
serait lu par sh, et non par bash, donc je devais éviter tout "bash-isme" (c'est à dire toute structure ou commande spécifique à bash, contrairement à celles exécutables par un simple Bourne shell). Au moins, bash hérite des variables définies par le bourne shell : il semble que certains enfants écoutent leur parents... Globalement, ça ne me semblait pas présenter trop de difficulté, j'avais juste besoin de prendre quelques précautions supplémentaires. Précédemment, j'aurais simplement modifié le shebang de /etc/gdm/Xsession
, mais j'étais déterminé à ne pas utiliser les privilèges du root, donc je m'interdisais cette option.
Le shell par défaut sous Ubuntu étant Bash, je savais qu'à chaque appel du shell, le fichier ~/.bashrc
serait lu. Traditionnellement on met tout ce qui n'est lu qu'une fois, comme le PATH, les fonctions, mesg n, etc. dans le fichier ~/.bash_profile
et tout ce qui est lu à chaque lancement du shell dans ~/.bashrc
, ce qui nous amène à le maintenir le plus court et le plus simple possible. Mais dans ce nouveau système, cet ordre des choses est modifié :
j'ai décidé de laisser mon fichier ~/.bash_profile
tel quel. Les bidouillages d'Ubuntu font qu'il n'est plus lu pour le moment mais ça ne veut pas dire que ce sera toujours le cas, et, si je change de nouveau de distribution, il sera à nouveau valide comme il l'a toujours été ;
le fichier ~/.xprofile
remplira désormais plus ou moins le rôle de ~/.bash_profile
, excepté qu'il doit suivre la syntaxe du bourne shell. Cela signifie que, puisque sh ne gère pas l'export -f, vous devrez donc exporter vos fonctions dans le ~/.bashrc
. En outre, puisque tout est lu avant que la moindre console ne soit lancée, toute fonction relative aux consoles (par ex. mesg) doit également être déplacée dans le .bashrc
. J'ai de même fait attention à ne pas inclure les lignes de ~/.bash_profile
qui font appel au ~/.bashrc
: elles seraient lues à chaque fois que je lancerais un shell, mais ce n'est pas souhaitable quand X lit ~/.xprofile
;
le ~/.bashrc
sera désormais un peu plus lourd : on y définit désormais toutes les fonctions, donc il n'est plus nécessaire de les exporter puisque chaque shell les récupère à son lancement, de même que tout ce qui touche à la configuration de la console. La définition des alias, qui se trouvait déjà dans ce fichier, y reste.
En essence, en me basant sur les règles que je vient de définir, j'ai fini par combiner les deux fichiers ~/.bash_profile
et ~/.bashrc
et à éclater leur contenu dans ~/.xprofile
et ~/.bashrc
.
Sachez que vous serez sévèrement punis si vous faites une erreur : toute erreur dans ~/.xprofile
fera planter votre session /etc/gdm/Xsession
et aboutira à un message d'erreur de GDM - quelque chose du genre « Votre session a duré moins de 10 secondes. Le démarrage du serveur X (votre interface graphique) a échoué. Il est probable qu'il ne soit pas configuré correctement. » Si jamais ça vous arrive, allez dans "Options / Choisir la session" dans GDM et choisissez "failsafe", puis jetez un œil au fichier ~/.xession_errors
pour situer et corriger le problème, puis réessayez.
Voici des exemples un peu allégés de mes fichiers ~/.bash_profile
, ~/.bashrc
et ~/.profile
. L'essentiel de ce que vous devez remarquer est ce qui a été déplacé, de quel fichier vers quel autre, et si ça a finalement trouvé sa place. J'ai surligné les lignes de ~/.xprofile
en bleu et celles de ~/.bashrc en vert. Tout ce qui se trouve en noir et gras est perdu puisque ça n'est plus applicable.
# ~/.bash_profile: execute au demarrage de bash if [ -f ~/.bashrc ]; then . ~/.bashrc fi ### EN VERT ### eval $(lesspipe) stty stop '' mesg n ### FIN VERT ### # Remarque : il faudrait re-adapter ces lignes a la syntaxe Bourne, # puisque le shell Bourne n'accepte pas l export et la declaration # en une commande ; cependant le '/bin/sh' de Debian/Ubuntu l # accepte, donc ce n'est pas un probleme ### BLEU ### export EDITOR=/usr/bin/vi export ENV=~/.shrc export LESSCHARSET=utf-8 export LIBGL_DRIVERS_PATH=/usr/lib/dri export LYNX_CFG=${HOME}/.lynxrc export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/games:/usr/local/games:/var/svn/linuxgazette.net/bin export PERLDOC="-otext" export PI=`perl -we 'printf "%.48f\n", atan2(0,-1)'` export RSYNC_RSH=/usr/bin/ssh export SVN_SSH=/usr/bin/ssh export WWW_HOME=file://${HOME}/lynx_bookmarks.html export XTIDE_DEFAULT_LOCATION='St. Augustine, city dock, Florida' # Sites export LG="linuxgazette.net" export NHC="www.nhc.noaa.gov" export WWW="okopnik.com" ### FIN BLEU ### TTY=`/usr/bin/tty 2>/dev/null` [ ${TTY:5:3} == "tty" ] && { # If not a console, bail! color=(foo blue green magenta) # tty's start at 1, arrays at 0... setterm -foreground ${color[${TTY#*y}]} -store }
# ~/.xprofile: exécuté au démarrage de X, version modifiée de # .bash_profile, doit être exécutable par /bin/sh export EDITOR=/usr/bin/vi export LESSCHARSET=utf-8 export LIBGL_DRIVERS_PATH=/usr/lib/dri export LYNX_CFG=${HOME}/.lynxrc export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/games:/usr/local/games:/var/svn/linuxgazette.net/bin export PERLDOC="-otext" export PI=`perl -we 'printf "%.48f\n", atan2(0,-1)'` export RSYNC_RSH=/usr/bin/ssh export SVN_SSH=/usr/bin/ssh export WWW_HOME=file://${HOME}/lynx_bookmarks.html # Sites export LG="linuxgazette.net" export NHC="www.nhc.noaa.gov" export WWW="okopnik.com"
# ~/.bashrc: execute par bash(1) sauf pour les shells de login # vous trouverez des exemples dans /usr/share/doc/bash/examples/startup-files # En cas de shell interactif : if [ "$PS1" ]; then mesg n eval $(lesspipe) # Load aliases initially; part of the 'realias' hack source ~/.aliases # Set up the LG build vars source $HOME/.lgrc # Update LINES and COLUMNS shopt -s checkwinsize # Set the xterm title case $TERM in gnome|nxterm|xterm*|rxvt*) PROMPT_COMMAND='echo -ne "\033]0;$USER@`hostname`: ${PWD}\007"' ;; esac fi ####### Parametrages proxy ################ [ -f ~/ENABLE_PROXY ] && { export HTTP_PROXY=`cat ~/ENABLE_PROXY` export http_proxy=$HTTP_PROXY export FTP_PROXY=$HTTP_PROXY export ftp_proxy=$HTTP_PROXY export no_proxy=localhost export NO_PROXY=localhost # Automate w3m proxying export W3M_OPTIONS='-o use_proxy=1 -o http_proxy='$HTTP_PROXY' -o ftp_proxy='$FTP_PROXY' -o no_proxy=localhost' alias w3m="$W3M_OPTIONS " } ####### Parametrages proxy ################ ############ Fonctions ##################### calc() { perl -wle'print eval join "", @ARGV' $@; } cdlg() { cd $LG_ARTICLES/`sed -n 's/currentIssue.*= *//;T;p' $LG_LIBPYTHON/lgconfig.py`; } h() { history|grep "^ *[0-9]* *$1"; } searchmail() { less -P "'n' to see the next match, 'q' to quit" -p "$1" ~/Mail/Sent_mail; } shake() { zless -p "$1" $HOME/Books/Other/The\ Complete\ Shakespeare.gz; } ip() { ifconfig "${1:-eth0}"|sed -n '2s/.* inet addr:\([0-9.]*\) .*/\1/p'; } pod() { cd /usr/share/perl/`perl -e'printf "%vd", $^V'`/pod; egrep "$1" *|less; } export -f calc cdlg h searchmail shake ip pod ############ Functions #####################
~/.bashrc
plus gros - ne s'est pas révélé être un problème. J'ai fait un test avec time bash -c exit et le temps de chargement et fermeture supplémentaire est de 0,004 secondes. En conséquence, je considère le problème résolu.
Ben Okopnik est le rédacteur en chef de la Linux Gazette© et il est membre de l'« Answer Gang ». Ben est né à Moscou en Russie en 1962. Il a commencé à s'intéresser à l'électricité dès l'âge de 6 ans en enfonçant une fourchette dans une prise et déclenchant ainsi un incendie, depuis il n'a jamais cessé de s'intéresser à la technologie. Il travaille avec les ordinateurs depuis les Temps Anciens où l'on devait souder soi-même des composants sur des cartes à circuits imprimés et où les programmes devaient tenir dans 4 ko de mémoire. Il serait heureux de payer tout psychologue capable de le guérir des cauchemars récurrents qu'il a gardés de cette époque. Ses expériences suivantes comprennent la création de programmes dans pratiquement une douzaine de langages, la maintenance de réseaux et de bases de données pendant l'approche d'un ouragan et l'écriture d'articles pour des publications allant des magazines de voile aux journaux technologiques. Après une croisière de 7 ans dans l'atlantique et les Caraïbes ainsi que des passages sur la côte Est des États-Unis, il a désormais jeté l'ancre à St-Augustine, en Floride. Instructeur technique chez Sun Microsystems, il travaille également à titre privé comme consultant open source et développeur Web. Ses passe-temps actuels sont notamment l'aviation, le yoga, les arts martiaux, la moto, l'écriture et l'histoire romaine. Son Palm Pilot est truffé d'alarmes dont la plupart contiennent des points d'exclamation.
L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.
Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.
Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.