Les fichiers de configuration du shell
De Wiki de la communauté Mandriva.
Si vous ne savez pas très bien comment modifier un fichier de configuration, jetez donc un coup d'œil pour commencer à la page Éditer des fichiers de configuration.
Introduction
Je ne prétends pas du tout traiter ici de la totalité des questions posées par les fichiers de configuration du shell Bash sous Linux, mais seulement donner quelques éléments partiels qui valent pour le système Mandriva Linux, dans son état actuel, et qui n'apparaissent pas toujours très clairement dans les diverses documentations… L'objectif principal sera de vous aider à créer vos propres modifications de votre système.
Notez que dans d'autres distributions Linux, les choses peuvent être un peu différentes de ce qui est décrit ici. Mais les principes généraux et les méthodes introduites dans cette page restent les mêmes.
Ce qui suit devrait vous aider à intervenir à bon escient sur votre système et vous permettre de modifier le contenu des fichiers de configuration en étant pleinement conscients de ce que vous faites.
Que puis-je faire à l'aide de ces fichiers ?
Vous pouvez personnaliser différents aspects de votre système en modifiant les fichiers de configuration dont nous allons parler. Pour plus de détails, cliquez sur les liens ci-dessous qui énumèrent quelques possibilités et lisez la suite de cette page.
Dans les fichiers de configuration vous pouvez :
- lancer des commandes représentant des actions ou des paramétrages que vous voulez faire exécuter chaque fois que vous vous connectez à une interface graphique (par exemple à votre bureau KDE, GNOME, XFCE etc.) ou à une console
- définir des alias (des abréviations de commandes complexes qui vous permettent de simplifier considérablement la frappe en console)
- définir des fonctions (les fonctions vous permettent de créer vous-même vos propres commandes personnalisées utilisables en console)
- fixer la valeur de certaines variables, notamment la variable PATH, qui dit au système où il peut trouver les commandes à lancer et la variable PS1, qui personnalise l'invite du shell
et... diverses autres choses que vous découvrirez dans le détail en lisant cette page plus avant :
- paramétrer le contenu et l'utilisation des fichiers d' historique du shell
- créer des raccourcis clavier personnalisés pour la console
- modifier la couleur des différents types de fichiers dans la sortie en console de la commande ls
Il est tout à fait possible de placer dans certains des fichiers de configuration dont il est question ici des commandes qui n'ont rien à voir avec le shell lui-même.
Notez toutefois que ces fichiers sont susceptibles d'être relus lors d'une connexion en console ou d'un changement d'identité en console : évitez donc d'y placer des commandes qui devraient impérativement n'être lancées qu'une seule fois pendant toute la durée de la session de votre bureau graphique (KDE, GNOME, XFCE etc.).
Dans ce dernier cas pensez aux fonctionnalités de votre bureau graphique : sous KDE, par exemple, vous pouvez créer une commande à lancer au démarrage en faisant : Menu étoile > Outils > Outils système > Configurer votre bureau > Avancé > Démarrage automatique > Ajouter un programme/Ajouter un script. La plupart des bureaux possèdent des fonctionnalités analogues.Pour savoir comment implémenter tout cela, voir la section #Et comment le faire ?.
Et comment le faire ?
Où placer mes personnalisations ?
Tout d'abord pour ce qui concerne les cas particuliers de la création de raccourcis clavier personnalisés pour la console et la modification de la couleur des différents types de fichiers dans la sortie en console de la commande ls, cliquer sur les liens que nous venons de fournir.
Nous décrivons dans cette section de façon compacte des techniques qui seront illustrées en détails à la section suivante.
Nous suggérons de placer les autres personnalisations :
- si elles doivent valoir (par défaut) pour tous les utilisateurs du système, dans un fichier custom.sh.
Nous plaçons ce fichier dans le répertoire /opt - si possible placé sur une partition à part - à l'intérieur d'un sous-répertoire que nous créons : /opt/bash_config.
L'ensemble de nos personnalisations destinées à tous les utilisateurs du système se trouvera donc en /opt/bash_config/custom.sh.
Ce fichier sera inclus (sourcé) tout à fait à la fin du fichier /etc/bashrc, grâce à la commande source, représentée usuellement par un point. La dernière ligne de notre /etc/bashrc deviendra ceci :
. /opt/bash_config/custom.sh # personnalisation par l'admin toto
Si nous avons pris soin de créer une partition /opt, alors, pour reconstituer nos personnalisations après une mise à jour de la distribution, il suffira de recréer la ligne ci-dessus dans le /etc/bashrc, pour reconstituer un vaste fichier de personnalisations complexes, il n'y aura rien d'autre à faire !! Nous donnerons un petit exemple concret plus bas.
- si vous avez besoin de définir certaines personnalisations pour un utilisateur particulier du système (personnalisations qui auront le pas sur les personnalisations par défaut du point précédent), c'est à peine plus compliqué.
Pour l'utilisateur titi, nous créons un fichier /opt/bash_config/custom_titi.sh, qui contiendra toutes les personnalisations concernant le seul titi, à l'exception de celles qui traitent de l'invite (variable PS1).
Nous plaçons la personnalisation de l'invite dans un fichier /opt/bash_config/custom_titi_PS1.sh.
/opt/bash_config/custom_titi.sh sera inclus (sourcé) tout à fait à la fin du fichier /home/titi/.bash_profile :
. /opt/bash_config/custom_titi.sh # personnalisation par l'utilisateur titi
/opt/bash_config/custom_titi_PS1.sh sera inclus (sourcé) tout à fait à la fin du fichier /home/titi/.bashrc :
. /opt/bash_config/custom_titi_PS1.sh # personnalisation par l'utilisateur titi
Là encore, après mise à jour de la distribution, vous n'aurez qu'à reconstituer ces deux lignes pour retrouver les personnalisations de titi.
Exemples
Pour l'ensemble du système
Pour une machine qui n'est destinée qu'à un seul utilisateur ou à un petit groupe familial, il est souvent bien plus simple de ne créer que des personnalisations pour l'ensemble des utilisateurs, comme illustré dans cette section-ci, plutôt que de procéder utilisateur par utilisateur comme illustré dans la section suivante.
Voici un exemple de fichier de personnalisations par défaut pour l'ensemble des utilisateurs du système, nous appellerons ce fichier custom.sh :
# /opt/bash_config/custom.sh
# sourcé comme dernière ligne de /etc/bashrc
# pour être lu pour tous les utilisateurs du système, root compris
# toutes ces personnalisation sont 'par défaut' (elles peuvent être annulés ou modifiées)
# dans les fichiers de configuration utilisateur
## personnalisation de l'invite
# l'invite de root définie ici sera activée par défaut que l'on soit passé root par la commande su ou par la commande su -
# et que l'on soit sous une console graphique (Konsole, Gnome-terminal) ou sous une console ''tty''
# \u : nom de l'utilisateur
# \h : nom de la machine
# \w : chemin complet du répertoire courant ou ~
if [ "`id -u`" = "0" ]; then # si root (UID de root est 0)
PS1="\[\033[0;31m\][\u@\h \w]\\$\[\033[0m\] " # l'invite est en rouge : \[\033[0;31m\]
# suivie d'un retour à la couleur par défaut : \[\033[0m\]
else # si simple utilisateur
PS1="[\u@\h \w]"'\\$'" " # l'invite est en couleur par défaut
fi
export PS1
## Les alias
alias dl="du -xk ./* | sort -n" # énumère les fichiers et sous-répertoires du répertoire courant
# par ordre de taille croissante, en kilo-octets
alias dt="du -sxh" # renvoie la taille du répertoire courant
## Les fonctions
# 'robinet à musique'
# usage :
# music : joue tous les fichiers .ogg et .mp[3,4] de ~/Musique/
# music xenakis : joue tous les fichiers d'oeuvres de Xénakis (le nom est insensible à la casse)
function music()
{
find ~/Musique/ -type f \( -ipath '*'$1'*.ogg' -o -ipath '*'$1'*.mp[3,4]' \) -print0 | xargs -0 -r -t vlc
}
# version allégée de la commande apropos
# usage :
# apros xkb : cherche les commandes qui traitent de xkb
# voir explications détaillées dans la section du Wiki Mandriva :
# Le shell sans peine : techniques avancées#Les fonctions
function apros() { apropos $1 | egrep -v '\(3|\(9|\(n\)'; }
## personnalisation de l'historique du shell
# interdit d'enregistrer les commandes dupliquées ainsi que ls sans arguments, bg, fg, et exit
# voir la page du Wiki de Mandriva L'historique du shell
export HISTIGNORE="&:ls:[bf]g:exit"
### FIN de /opt/bash_config/custom.sh
Nous plaçons ce fichier dans le répertoire /opt - qui occupe une partition qui lui est propre - dans un sous-répertoire bash_config/ que nous dédions au shell.
Ce fichier est donc en /opt/bash_config/custom.sh
Il sera sourcé dans la dernière ligne du fichier de configuration du shell /etc/bashrc :
. /opt/bash_config/custom.sh # personnalisation par l'administrateur toto
Si /opt occupe une partition à part, lors d'une mise à jour ou d'une réinstallation de votre distribution reconstituer cette ligne dans /etc/bashrc sera la seule chose à faire pour retrouver vos personnalisations.
Notez que le fichier custom.sh n'a pas à être exécutable. Les utilisateurs autres que son propriétaire root peuvent seulement le lire.
A la sortie de la commande ls concernant ce fichier, on doit voir quelque chose comme ceci :
[utilisateur@ordi]$ ls -l /opt/bash_config/custom.sh -rw-r--r-- 1 root root 1715 2010-02-28 14:58 /opt/bash_config/custom.sh
Pour arriver à ce résultat, taper sous root :
[root@ordi]# cd /opt/bash_config && chown root: custom.sh && chmod 644 custom.sh
Pour un seul utilisateur
Pour une machine qui n'est destinée qu'à un seul utilisateur ou à un petit groupe familial, il est souvent bien plus simple de ne créer que des personnalisations pour l'ensemble des utilisateurs, comme illustré à la section précédente, plutôt que de procéder utilisateur par utilisateur comme illustré dans cette section.
Reprenons les choses à zéro et supposons que nous souhaitions définir les mêmes personnalisations que dans la section précédente, mais cette fois pour le seul utilisateur titi.
Comme nous allons le voir, si nous ne souhaitons définir pour le seul titi aucune personnalisation particulière de l'invite, c'est très simple. Si nous devons personnaliser aussi l'invite, c'est un petit peu plus compliqué.
Nous créons d'abord un fichier custom_titi.sh que nous plaçons, comme précédemment, dans le répertoire /opt/bash_config : ce fichier contiendra toutes les personnalisations pour titi, sauf celles qui concernent l'invite du shell (variable PS1).
# /opt/bash_config/custom_titi.sh
# sourcé comme dernière ligne de /home/titi/.bash_profile
# personnalisations pour l'utilisateur titi (invite exclue)
## Les alias
alias dl="du -xk ./* | sort -n" # énumère les fichiers et sous-répertoires du répertoire courant
# par ordre de taille croissante, en kilo-octets
alias dt="du -sxh" # renvoie la taille du répertoire courant
## Les fonctions
# 'robinet à musique'
# usage :
# music : joue tous les fichiers .ogg et .mp[3,4] de ~/Musique/
# music xenakis : joue tous les fichiers d'oeuvres de Xénakis (le nom est insensible à la casse)
function music()
{
find ~/Musique/ -type f \( -ipath '*'$1'*.ogg' -o -ipath '*'$1'*.mp[3,4]' \) -print0 | xargs -0 -r -t vlc
}
# version allégée de la commande apropos
# usage :
# apros xkb : cherche les commandes qui traitent de xkb
# voir explications détaillées dans la section du Wiki Mandriva :
# Le shell sans peine : techniques avancées#Les fonctions
function apros() { apropos $1 | egrep -v '\(3|\(9|\(n\)'; }
## personnalisation de l'historique du shell
# interdit d'enregistrer : commandes dupliquées, ls sans arguments, bg, fg, exit
# explication dans la page du Wiki de Mandriva L'historique du shell
export HISTIGNORE="&:ls:[bf]g:exit"
### FIN de custom_titi.sh
Ce fichier est sourcé en fin de /home/titi/.bash_profile ainsi :
. /opt/bash_config/custom_titi.sh # personnalisation par titi
Les personnalisations pour l'invite du shell de titi devront, quant à elles, être placées dans un fichier à part /opt/bash_config/custom_titi_PS1.sh qui sera sourcé dans le fichier .bashrc de titi (si ces personnalisations étaient incluses ou sourcées dans le .bash_profile elles ne seraient jamais prises en compte dans une console graphique, comme vous le comprendrez en lisant la section suivante).
# /opt/bash_config/custom_titi_PS1.sh
# sourcé comme dernière ligne de /home/titi/.bashrc
# personnalisation de l'invite pour titi
## personnalisation de l'invite
# \u : nom de l'utilisateur
# \h : nom de la machine
# \w : chemin complet du répertoire courant ou ~
PS1="[\u@\h \w]"'\\$'" " # l'invite est en couleur par défaut
export PS1
En fin de /home/titi/.bashrc, nous plaçons la ligne :
. /opt/bash_config/custom_titi_PS1.sh # personnalisation par titi
Si /opt occupe une partition à part, lors d'une mise à jour ou d'une réinstallation de votre distribution reconstituer la dernière ligne de /home/titi/.bash_profile (et éventuellement la dernière ligne de /home/titi/.bashrc) sera la seule chose à faire pour retrouver les personnalisations de titi.
Notez que ces fichiers n'ont pas à être exécutables. Les utilisateurs autres que leur propriétaire root peuvent seulement les lire.
A la sortie de la commande ls concernant ces fichiers, on doit voir quelque chose comme ceci :
[utilisateur@ordi]$ ls -l /opt/bash_config/custom_titi.sh /opt/bash_config/custom_titi_PS1.sh -rw-r--r-- 1 root root 355 2010-03-01 08:56 /opt/bash_config/custom_titi_PS1.sh -rw-r--r-- 1 root root 1316 2010-03-01 08:49 /opt/bash_config/custom_titi.sh
Pour arriver à ce résultat, taper sous root :
[root@ordi]# cd /opt/bash_config && chown root: custom_titi.sh custom_titi_PS1.sh && chmod 644 custom_titi.sh custom_titi_PS1.sh
Bien entendu titi ne peut définir l'invite de root, s'il souhaite qu'elle s'affiche avec une couleur rouge, comme nous l'avions obtenu à la section précédente, il devra demander à l'administrateur de placer dans le fichier /opt/bash_config/custom.sh (sourcé comme indiqué à la section précedente), une section comme celle-ci :
## extrait de /opt/bash_config/custom.sh sourcé en fin de /etc/bashrc
## personnalisation de l'invite
# \u : nom de l'utilisateur
# \h : nom de la machine
# \w : chemin complet du répertoire courant ou ~
if [ "`id -u`" = "0" ]; then # si root (UID de root est 0)
PS1="\[\033[0;31m\][\u@\h \w]\\$\[\033[0m\] " # l'invite est en rouge : \[\033[0;31m\]
fi # suivie d'un retour à la couleur par défaut : \[\033[0m\]
L'invite de root revêtira alors une belle couleur rouge, que l'on ait adopté son identité par la commande su ou par la commande su - et que l'on soit sous une console graphique (Konsole, Gnome-terminal) ou sous une console tty.
Explications : les relations entre les fichiers de configuration
Dans le reste de cette section, nous essayons d'expliquer le pourquoi de ces suggestions. Si vous ne souhaitez pas "comprendre" tout cela, ou bien si vous êtez vraiment pressé, eh bien ma foi, arrêtez-vous ici...
Notez d'abord que, si les principes généraux restent en gros les mêmes d'une distribution Linux à une autre, le nom, voire l'existence de certains des fichiers de configuration du shell et leurs relations "chronologiques" à l'exécution peuvent varier légèrement. Pour vérifier ce qu'il en est si vous essayez une autre distribution, pour pourrez utiliser les techniques qui sont explicitées dans la section #Comment se rendre compte de tout cela par soi-même.
Pour savoir où au juste placer vos personnalisations, il est bon d'avoir une idée de l'ordre dans lequel sont exécutés les principaux fichiers de configuration,
afin d'éviter que vos personnalisations puissent être annulées par des lignes ou des fichiers qui seraient exécutés après elles. Inversement, il est nécessaire que les personnalisations d'un unique utilisateur aient le pas sur les personnalisations pour l'ensemble du système, et donc soient exécutées autant que possible après elles.
En lisant le contenu des scripts, comme en examinant les messages affichés par les lignes de commande echo ou touch que vous avez pu ajouter en suivant les indications données dans la section #Comment se rendre compte de tout cela par soi-même, vous verrez que, sous Mandriva :
- A la connexion à l'interface graphique ou à une console tty, sont lancés successivement : /etc/profile, puis ~/.bash_profile
- ~/.bash_profile lance ~/.bashrc
- ~/.bashrc lance /etc/bashrc.
- Les fichiers *.sh de /etc/profile.d sont lancés dans les shells de connexion par /etc/profile et dans les shells sans connexion par /etc/bashrc, ils sont donc toujours lancés au démarrage d'un shell, que le shell soit login ou non login et qu'il soit ou non enfant d'une autre instance du shell.
Au total, voici ce qui se passe, sur une Mandriva
- après connexion à votre bureau (KDE ou GNOME...)
- ou après connexion à une console tty
- ou après un changement d'identité en console effectué avec su - toto ou su - :
Nous avons proposé de mettre les modifications personnalisées destinées à tous les utilisateurs du système à la fin du fichier /etc/bashrc (sous la forme d'un fichier custom.sh sourcé, voir plus haut dans cette section). C'est tout à fait raisonnable : vos personnalisations ne risqueront pas d'être annulées par le fichier /etc/profile dont l'exécution est terminée en ce point, ni bien sûr par les lignes précédentes du bashrc lui-même.
Pour ce qui est des personnalisations propres à un utilisateur particulier du système, nous avons proposé de les placer à la fin du ~/.bash_profile (sous la forme d'un fichier custom_<nom_d_utilisateur>.sh sourcé, voir plus haut dans cette section). On pourrait envisager aussi - et on le fait parfois - de les placer dans le fichier ~/.bashrc . Dans beaucoup de cas cela ne ferait pas de différence. Toutefois il y a au moins une raison de préférer notre suggestion et cela concerne ce qui se passe lorsque, étant en console (tty ou graphique), vous voulez changer d'identité pour obtenir les droits sur certains fichiers ou répertoires. Dans ce cas, si tous les utilisateurs du système placent leurs personnalisations dans le
~/.bash_profile , alors vous pourrez conserver après le changement d'identité toutes vos personnalisations d'origine, ce qui ne serait pas le cas si tous les utilisateurs plaçaient leurs personnalisations dans leur ~/.bashrc personnel.
En effet, lorsque vous changez d'identité dans une console (tty ou graphique) à l'aide d'une commande telle que su toto (ou simplement su), voici ce qui se passe (le ~/.bashrc appelé sera celui du nouvel utilisateur toto ou root) :
Notez bien que ne sont relus ni le ~/.bash_profile de la nouvelle identité, ni d'ailleurs le /etc/profile . Si les personnalisations utilisateur sont dans ~/.bash_profile , les personnalisations utilisateur de la nouvelle identité ne seront donc pas prises en compte.
Mais que faire alors si je veux au contraire basculer complètement sous la nouvelle identité (personnalisation de cette identité comprise) ? C'est très simple : il suffit de recourir aux commandes faisant usage du signe '-' de type su - toto (pour adopter l'identité de toto) ou su - (pour adopter l'identité de root). Dans ce cas, en effet, tout se passe comme lors de la connexion initiale à un bureau graphique ou à une console tty (voir notre premier schéma), et en particulier le fichier ~/.bash_profile de la nouvelle identité est lu.
Les raccourcis clavier personnalisés que vous voulez créer pour la console sont, eux, à placer dans /etc/inputrc ou ~/.inputrc. Voir cette section.
Pour modifier la couleur des fichiers affichés par la commande ls vous interviendrez sur /etc/DIR_COLORS ou ~/.dir_colors. Voir cette section.
Pour modifier le contenu et l'utilisation du fichier ~/.bash_history, voir la page L'historique du shell.Différences entre les fichiers de configuration
Les fichiers de configuration du shell se distinguent de quatre façons (au moins) :
Par les utilisateurs concernés
- les uns valent pour tous les utilisateurs du système, ils sont situés dans le répertoire /etc, citons par exemple :
- /etc/profile
- /etc/bashrc
- l'ensemble des fichiers dont les noms sont de la forme *.sh contenus dans le répertoire /etc/profile.d.
- A titre d'exemple, dans mon système, il s'agit de l'ensemble de fichiers suivants :
01msec.sh
10inputrc.sh
10lang.sh alias.sh
10mandriva-release.sh
10tmpdir.sh
20less.sh
20mc.sh
20screen.sh
30menustyle.sh
30python.sh
50pilot.sh
50ssh-askpass.sh
60qt4.sh
70kde4.sh
90qtdir3.sh
90ssh-client.sh
99keychain.sh
canberra.sh
configure_keyboard.sh
gconf.sh
glib20.sh
gpg-agent.sh
ladspa.sh
openoffice.org.sh
- A titre d'exemple, dans mon système, il s'agit de l'ensemble de fichiers suivants :
Les préfixes numériques en tête du nom de certains des fichiers de /etc/profile.d imposent un ordre d'exécution (par exemple, un fichier avec le préfixe 10, comme 10lang.sh, sera exécuté avant un fichier avec le préfixe 20, comme 20mc.sh.
- Toute modification apportée à l'un de ces fichiers vaut pour tout utilisateur du système.
- d'autres fichiers sont propres à un utilisateur, et sont situés dans son répertoire personnel, par exemple :
- ~/.bash_profile
- ~/.bashrc
- ~/.bash_logout
Le symbole '~' représente le répertoire personnel d'un utilisateur. Pour l'utilisateur toto, on aura par défaut : '~' = /home/toto/.
- Les modifications apportées à ces fichiers ne concernent qu'un seul utilisateur (une modification de /home/toto/.bashrc n'aura de conséquence que pour l'utilisateur toto).
Par le type de shell qui les lit en démarrant
- shell interactif ou shell non interactif
- Lorsque le shell exécute un script, il lit des lignes de code dans un fichier, il n'est pas alors, en général, 'à l'écoute' de ce que vous tapez en console : on dit dans ce cas que le shell est non interactif.
- Lorsque, au contraire, vous lancez des commandes pour le shell dans n'importe quelle console, vous êtes dans un shell interactif.
- Nous nous intéressons ici uniquement aux shells interactifs. Les fichiers de configuration que nous évoquons ne sont pas en général lus par les shells non interactifs.
Parmi les shells interactifs, on doit encore distinguer :
- shell de connexion (en anglais login shell) ou shell sans connexion (non login shell)
- Le shell varie à cet égard selon le type de la console dans laquelle vous l'invoquez. Il faut distinguer :
- Les consoles tty
- Elles sont ainsi appelées parce qu'elles correspondent dans le répertoire /dev à des fichiers spéciaux /dev/ttyn (où n est un nombre), pour mémoire : tty vient du mot TeleTYpe. Ces consoles, qu'on appelle aussi parfois consoles texte sont celles sur lesquelles vous vous rendez par les combinaisons de touches <CTRL-ALT-F1> à <CTRL-ALT-F6>.
Pour exécuter une commande sur de telles consoles vous devez d'abord vous connecter (vous loguer) en tapant votre nom d'utilisateur (le login) et votre mot de passe.
Les shells que vous exécutez alors sont des shells de connexion (login shells).
Remarque: en toute rigueur, il est possible d'exécuter une commande dans une console sans passer par la phase login avec la commande openvt ... lancée depuis une autre console. En fait le login est lui-même une commande destinée à gérer les accès à cette console. Vous pouvez essayer avec:
openvt -c 9 login
si la console tty9 est libre. C'est ce que fait le programme init à la fin de la séquence de démarrage lorsqu'il initialise les consoles tty1 à tty6 configurées dans /etc/inittab.
On peut aussi utiliser cette commande pour lancer un shell de connexion tôt lors du processus de démarrage. On peut imaginer qu'on ait besoin d'examiner l'état du système au moment du lancement des différents services en mode interactif (Rappel: ajouter l'option "noyau" confirm et presser la touche I au moment du message de bienvenue). Pour que cela fonctionne, il faut avoir préalablement créé un "service" qui initialise ce shell de connexion.
- Les consoles graphiques
- Ce sont celles que vous invoquez à partir de votre environnement X (autrement dit sous KDE, GNOME, IceWM...) quand vous lancez des utilitaires tels que Konsole, Gnome-terminal, xterm, rXVT etc.
- Dans /dev, ces consoles sont représentées par des fichiers /dev/pts/n où n est un nombre (pts pour pseudo-terminaux= pseudo-terminals en anglais).
- Lorsque vous ouvrez une telle console vous n'avez pas à vous connecter, à fournir login et mot de passe.
Les shells qui interprètent des commandes lancées sur de telles consoles sont donc des shells sans connexion (non login shells) - sauf toutefois après une connexion via une commande du type su - toto ou simplement su -, qui force l'appel à un shell de connexion.
Rappel : Les shells interactifs peuvent être des login shells ou des non login shells.
Parmi les fichiers de configuration mentionnés plus haut, les suivants ne sont lus QUE par des login shells :
- /etc/profile
- ~/.bash_profile
- ~/.bash_logout
Les deux premiers sont lus juste après que vous ayez fourni identifiant et mot de passe et le dernier est lu juste avant la déconnexion.
Toute modification que vous y introduirez ne sera donc d'aucun effet lorsque vous vous contenterez d'ouvrir ou de relancer, immédiatement après avoir introduit la modification, une console graphique (du genre de l'utilitaire Konsole ou rxvt etc.), à laquelle vous avez accédé sans fournir identifiant et mot de passe, où les commandes que vous lancerez seront toujours lues par un non login shell. MAIS :
Se connecter sous une interface graphique (autrement dit, ouvrir une session KDE, GNOME, XFCE etc.) est assimilé à cet égard à se connecter sous une sorte particulière de console : et de ce fait les deux premiers fichiers, /etc/profile et ~/.bash_profile seront lus dès la connexion à une interface graphique. En revanche, ~/.bash_logout n'est pas lu à la déconnexion de l'interface graphique.
Tous les autres fichiers mentionnés plus haut (/etc/bashrc ou ~/.bashrc et les fichiers *.sh de /etc/profile.d) sont, en revanche, lus et par les login shells et par les non login shells : toute modification que vous y introduirez sera prise en compte immédiatement chaque fois que vous accèderez à une console, quelle qu'elle soit, ou à votre interface graphique (KDE, GNOME).
Par le fait que le shell concerné est lui-même ou non un processus enfant d'une autre instance du shell
Les fichiers /etc/profile et ~/.bash_profile ne sont lus qu'au premier lancement d'un login shell, si ensuite Bash s'appelle lui-même et lance un 'shell enfant' ces fichiers ne sont pas lus une seconde fois. Au contraire /etc/bashrc et ~/.bashrc sont lus à chaque nouvel appel du shell en console.
/etc/profile et ~/.bash_profile sont AUSSI lus silencieusement au moment ou le serveur X lance une session (au démarrage de KDE, par exemple). De ce fait, les initialisations de variables qu'ils contiennent sont disponibles sous les consoles graphiques, bien que les shells qui sont attachés à ces consoles ne lancent pas eux-mêmes ces deux fichiers en démarrant.
Par la variété de shell utilisée
Tous les fichiers de configuration dont il est question ici sont lisibles par un shell Bash mais tous ne le sont pas par d'autres types de shells, attention, pensez donc à vérifier ce qu'il en est si vous avez recours à d'autres sortes de shells (Korn shell, C-shell etc.).
Comment se rendre compte de tout cela par soi-même
Pour bien vous rendre compte de tout cela un moyen très intuitif consiste à modifier chacun des fichiers :
/etc/profile
~/.bash_profile
/etc/bashrc
~/.bashrc
~/.bash_logout
de la façon suivante : mettre au tout début de chaque fichier une ligne de ce type
echo "DEBUT de /chemin/nom_du_fichier"
et en dernière ligne ceci :
echo "FIN de /chemin/nom_du_fichier"
Naturellement vous mettrez à la place de /chemin/nom_du_fichier l'information appropriée pour chaque fichier, par exemple pour /etc/profile ce sera :
echo "DEBUT de /etc/profile"
et
echo "FIN de /etc/profile"
Dans le cas particulier de ~/.bash_logout utilisez la commande sleep pour avoir le temps de voir vraiment ce qui se passe et écrivez ces lignes en fin de fichier :
echo "/home/toto/.bash_logout" sleep 4
Pour tester l'exécution des fichiers du répertoire /etc/profile.d/, créez un fichier /etc/profile.d/00test.sh (n'omettez surtout pas l'extension .sh), dont le contenu pourra ressembler à ceci :
echo "DEBUT des fichiers de /etc/profile.d"
Ensuite, lancez le shell, dans une console tty (accessible par <Ctrl-Alt-F1>, avec retour au bureau par Alt-F7), puis dans une console graphique (Konsole, Gnome-terminal etc.). Regardez bien ce qui se passe dans les deux cas.
Sur chacune de ces consoles, changez maintenant d'utilisateur (s'il existe d'autres utilisateurs sur votre machine, dont vous connaissez le mot de passe). Il est très intéressant de relancer aussi votre propre identité ainsi :
[toto@ordi]$ su toto
et aussi ainsi :
[toto@ordi]$ su - toto
observez la différence selon que vous avez utilisé su et su -
Rappel : pour quitter une identité taper exit.
Passez sous root avec su et su - et comparez ce que vous observez dans les deux cas.
Au moment de la connexion ou de la déconnexion à votre bureau vous ne disposer pas de console. Les astuces précédentes ne peuvent pas vous montrer ce qui se passe. Vous devez donc procéder autrement. Un moyen bien simple consiste à ajouter comme dernière ligne du fichier de configuration qui vous intéresse, une commande qui crée un fichier texte et y ajoute à chaque exécution une ligne comportant date et heure.
Quelque chose comme :
echo `date` >> /home/toto/test_<nom_du_fichier_testé>
Attention : placez ce genre de commande à la fin du fichier (pour éviter qu'il ne soit pris dans un branchement conditionnel).
Vous pourrez déterminer ensuite, selon que le fichier test est créé ou pas si le fichier de configuration correspondant a été ou non exécuté et le nombre de lignes qu'il contient vous dira combien de fois il l'a été.
Pensez à ajoutez aussi une ligne de ce genre dans votre fichier test /etc/profile.d/00test.sh qui devient :
echo "DEBUT des fichiers de /etc/profile.d" echo `date` >> /home/toto/test_profile_d
Déconnectez-vous de votre bureau puis reconnectez-vous et voyez ce qu'il en est.
Et voilà, vous pouvez maintenant vérifier la validité de ce qui a été dit dans cette page sur ces fichiers de configuration du shell...
Et si vous essayez une distribution autre que Mandriva, vous pourrez déterminer comment tout cela fonctionne sur cette distribution.
Créer des raccourcis clavier pour la console avec inputrc
Comment comprendre, modifier ou compléter inputrc
Un autre fichier de configuration est important pour votre utilisation du shell en console : le fichier /etc/inputrc qui configure la bibliothèque Readline, laquelle est utilisée par le shell pour l'interprétation des touches ou combinaisons de touches du clavier.
Pour des exemples de configuration personnalisée d'inputrc, voir la section suivante. Sur des indications complémentaires (en français) pour configurer inputrc, voir cette page de la Gazette Linux - Comment créer des raccourcis clavier sur les consoles Linux. Compléter par la section READLINE de la page de man de bash (man bash)
Attention, inputrc n'est pas écrit en shell. Il parle une autre langue avec une autre syntaxe. N'essayez pas d'introduire des commandes echo dans ce fichier, comme nous avons suggéré de le faire plus haut pour d'autres fichiers de configuration. N'essayez pas non plus de sourcer un fichier texte dans inputrc, comme nous l'avons fait aussi plus haut (vous utiliserez à la place des directives $include, comme nous le verrons).
Nous donnerons ici quelques indications qui vous permettront de comprendre inputrc et de le modifier ou d'y ajouter de nouvelles commandes.
Le fichier inputrc contient essentiellement :
- des lignes du type set machin on ou set machin off qui activent ou désactivent, respectivement, une certaine fonctionnalité machin
- des lignes de la forme "chaîne": machin (attention aux guillemets !) qui disent que la chaîne de caractères chaîne correspondra désormais à la commande machin
- des lignes de la forme "chaîne": "autre_chaîne" (attention aux guillemets !) qui disent que la chaîne de caractères chaîne doit être remplacée par autre_chaîne.
Pour comprendre l'essentiel des lignes de ce fichier (et éventuellement en créer de nouvelles), il suffit de noter ce qui suit.
- Dans les deux derniers cas ci-dessus, les caractères à gauche des deux-points sont ceux que renvoient les touches du clavier de façon ordinairement « invisible ».
- Pour connaître ces caractères « invisible » renvoyés par une certaine touche, il suffit de taper Ctrl-V (ou Ctrl-Q) suivi de la touche en question.
- Il faut en outre savoir que Ctrl est représenté dans inputrc par \C et que la suite ^[ (envoyée notamment par la touche Echap) est abrégée en \e.
Illustrons : sous Konsole, si vous faites Ctrl-V, FIN (il s'agit ici de Contrôle+V suivi de la touche FIN), vous obtenez à l'écran ^[[F, ce qui montre qu'il s'agit là de la chaîne de caractères envoyée par la touche FIN de façon invisible. Nous pouvons comprendre maintenant, par exemple, la ligne suivante, qui se trouve dans mon inputrc :
"\e[F": end-of-line
étant donné que \e représente ^[ cette ligne équivaut à ^[[F': end-of-line et comme nous savons que ^[[F représente ce que renvoie la touche FIN, il s'ensuit que cette ligne signifie simplement que la touche FIN doit activer la fonction end-of-line, c'est-à-dire la fonction aller en fin de ligne.
Noter enfin que, selon les types de console, les caractères renvoyés par certaines touches peuvent différer, par exemple la touche FIN renvoie, comme nous l'avons vu, ^[[F sous Konsole mais ^[[8~ sous rXVT.
/etc/inputrc régit l'ensemble des utilisateurs de votre système, si nécessaire vous pouvez créer un fichier ~/.inputrc pour un utilisateur particulier (mais il devra contenir une directive $include qui inclura dans le ~/.inputrc le fichier général /etc/inputrc - voir un exemple à la section suivante).
Muni de ce bagage substantiel, vous pourrez maintenant explorer et éventuellement modifier votre inputrc…
Vous pourrez notamment comprendre les exemples simples de la section suivante et consulter l'article plus détaillé : cette page de la Gazette Linux - Comment créer des raccourcis clavier sur les consoles Linux.
Exemples
Les personnalisations que nous évoquons ci-dessous sont possibles si vous travaillez en console en mode emacs, qui est le mode par défaut.
Elles ne semblent pas fonctionner si vous êtes en mode vi (que vous pouvez adopter par la commande set -o vi).
Pour l'ensemble des utilisateurs
Pour que vos personnalisations soient disponibles pour l'ensemble des utilisateurs de votre système, vous pourrez les placer dans un fichier custom_inputrc.
Placer ce fichier dans le répertoire /opt - de préférence occupant une partition qui lui est propre - dans un sous-répertoire bash_config que vous dédiez à toutes les personnalisations du shell.
Voici un exemple possible de fichier custom_inputrc :
## /opt/bash_config/custom_inputrc # à inclure via $include dans /etc/inputrc ## pour faciliter l'emploi de la commande Bash su -c # voir la section du Wiki Root#su -c # usage : # 1. tapez votre commande # 2. taper Ctrl-x puis ENTREE # 3. mot de passe root # la console reviendra immédiatement à votre identité d'utilisateur après exécution de la commande "\C-x": "\C-e\"\C-asu -c \"PATH=/sbin:/usr/sbin:$PATH;" # FIN de custom_inputrc
Nous incluons ce fichier dans le /etc/inputrc immédiatement après la directive $if mode=emacs. Voici la partie concernée du /etc/inputrc :
$if mode=emacs # Personnalisation par l'administrateur $include /opt/bash_config/custom_inputrc
Si /opt occupe une partition à part, lors d'une mise à jour ou d'une réinstallation de votre distribution reconstituer cette ligne sera la seule chose à faire pour retrouver vos personnalisations.
Notez que ce fichier n'a pas à être exécutable. Les utilisateurs autres que son propriétaire root peuvent seulement le lire. A la sortie de la commande ls concernant ce fichier, on doit voir quelque chose comme ceci :
[utilisateur@ordi]$ ls -l /opt/bash_config/custom_inputrc -rw-r--r-- 1 root root 355 2010-03-01 08:56 /opt/bash_config/custom_inputrc
Pour arriver à ce résultat, taper sous root :
[root@ordi]# cd /opt/bash_config && chown root: custom_inputrc && chmod 644 custom_inputrc
Pour un utilisateur particulier
Pour créer une personnalisation pour le seul utilisateur titi, vous pouvez créer un fichier de configuration custom_inputrc_titi.
Vous le placerez dans le répertoire /opt - de préférence occupant une partition qui lui est propre - dans un sous-répertoire bash_config que nous dédions à la configuration du shell.
Un exemple d'un tel fichier pourrait être :
## /opt/bash_config/custom_inputrc_titi # créer un lien /home/titi/.inputrc vers ce fichier # nous lisons le fichier général /etc/inputrc $include /etc/inputrc ## pour faciliter l'emploi de la commande Bash su -c # voir la section du Wiki Root#su -c # usage : # 1. tapez votre commande # 2. taper Ctrl-x puis ENTREE # 3. mot de passe root # la console reviendra immédiatement à votre identité d'utilisateur après exécution de la commande "\C-x": "\C-e\"\C-asu -c \"PATH=/sbin:/usr/sbin:$PATH;" ## FIN de custom_inputrc_titi
(notez qu'il est nécessaire d'ajouter la directive $include /etc/inputrc pour que le contenu du /etc/inputrc d'origine soit lu)
Nous allons maintenant installer ce fichier de configuration en créant un lien ainsi, sous root.
[root@ordi]# ln -sv /opt/bash_config/custom_inputrc_titi /home/titi/.inputrc
Notre fichier tiendra donc lieu de ~/.inputrc pour l'utilisateur titi.
Si /opt occupe une partition à part, lors d'une mise à jour ou d'une réinstallation de votre distribution reconstituer ce lien sera la seule chose à faire pour retrouver vos personnalisations.
Notez que ce fichier n'a pas à être exécutable. Les utilisateurs autres que son propriétaire root peuvent seulement le lire.
A la sortie de la commande ls concernant ce fichier, on doit voir quelque chose comme ceci :
[utilisateur@ordi]$ ls -l /opt/bash_config/custom_inputrc_titi -rw-r--r-- 1 root root 355 2010-03-01 08:56 /opt/bash_config/custom_inputrc_titi
Pour arriver à ce résultat, taper sous root :
[root@ordi]# cd /opt/bash_config && chown root: custom_inputrc_titi && chmod 644 custom_inputrc_titi
L'historique des commandes
Le fichier ~/.bash_history contient une liste des commandes précédemment tapées en console. Pour l'utilisation de cette fonctionnalité et des indications permettant de la paramétrer voir l'historique du shell.
Modifier les couleurs d'affichage des fichiers à la sortie de la commande ls
Les couleurs et divers aspects de l'affichage à l'écran de la sortie de ls sont déterminés par le fichier de configuration /etc/DIR_COLORS pour l'ensemble du système et par ~/.dir_colors pour un utilisateur.
Voir là-dessus : Le shell sans peine : techniques avancées#Comment modifier les couleurs des listes de fichiers affichées par ls ?.
Précautions à prendre lors de modifications de fichiers de configuration
Quelques remarques de bon sens, mais très importantes :
1) Ne faites pas 'n'importe quoi', renseignez-vous aux meilleures sources avant d'agir
2) Si vous voulez faire toute une série de modifications, procédez étape par étape, introduisez une modification, testez-la avec soin et ensuite seulement passez à la suivante
3) Commencez par sauvegarder le fichier dans son état originel en lui donnant un nom facile à repérer (du genre nom_de_fichierVieux)
4) Faites en sorte de pouvoir retrouver très facilement vos modifications. Une façon de faire : si vous insérez une ligne faites-la suivre d'un commentaire avec vos initiales, vous pourrez la retrouver très facilement par inspection visuelle du fichier ou avec une fonction de recherche de votre éditeur de texte, pour Toto Dugommier, une ligne de code blablabla ajoutée sera :
blablabla #TD
Procédez de la même façon pour une modification d'une ligne existante en indiquant en commentaire la nature du changement. Enfin si vous voulez désactiver une ligne mettez un commentaire devant plutôt que de l'effacer, pour la ligne bliblibli cela donnera :
# bliblibli #TD
Pour le shell Bash les commentaires sont précédés d'un dièse (#), pour certains autres fichiers de configuration du système les commentaires peuvent être codés différemment, pensez-y à l'occasion...
Ayez une politique sérieuse et systématique de sauvegarde (pensez, par exemple, à utiliser Unison).
Plutôt que de changer le contenu par défaut des fichiers de configuration (ce qui peut être dangereux, si vous n'êtes pas très expert), il est moins risqué d'ajouter des personnalisations en laissant le contenu par défaut inchangé.
Si vous suivez systématiquement ces procédures, vous resterez maître de la situation… sinon… j'en frissonne…
Ca



