On désire proposer de façon générique un éditeur via la commande
éditeur. Cette commande aura pour but de choisir un éditeur parmi
une liste définie, et de le lancer. Pour se faire, nous allons utiliser les
alternatives. L'intérêt de cette méthode est de rendre transparent la sélection
de clones pour un programme et de simplifier leur administration. Par exemple,
on pourrait souhaiter de rassembler derrière la commande browser
les logiciels mozilla, firefox, galeon,
dillo, etc.
L'ensemble des commandes à gérer est rassemblé dans un groupe, que nous
appellerons ici éditeur. De plus, on associe une priorité à chaque
alternative du groupe. Lorsque le groupe est administré en mode
auto, l'alternative employée est celle possédant la plus haute
priorité.
Dans notre cas, nous avons les 3 éditeurs suivants que nous souhaiterions
gérer derrière notre commande générique /bin/éditeur. Cette
commande sera en fait un lien dynamique pointant vers l'un des 3 logiciels
suivants :
/usr/bin/vi
/usr/bin/vim
/usr/bin/nvi
La première étape consiste à créer notre groupe éditeur.
$ update-alternatives --install /bin/éditeur éditeur /usr/bin/vim 9
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vim - priority 9
Current `best' version is /usr/bin/vim.
D'ailleurs, il est facile de le vérifier.
$ /bin/éditeur --version
VIM - Vi IMproved 6.3 (2004 June 7, compiled Jan 19 2005 08:10:19)
Continuons, et rajoutons nvi à notre groupe. Nous lui mettrons
la priorité 2.
$ update-alternatives --install /bin/éditeur éditeur /usr/bin/nvi 2
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vim - priority 9
/usr/bin/nvi - priority 2
Current `best' version is /usr/bin/vim.
Continuons encore, et rajoutons vi à notre groupe. Nous lui
mettrons la priorité 1, c'est à dire la plus faible.
$ update-alternatives --install /bin/éditeur éditeur /usr/bin/vi 1
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vim - priority 9
/usr/bin/nvi - priority 2
/usr/bin/vi - priority 1
Current `best' version is /usr/bin/vim.
Notre groupe est désormais prêt. La commande éditeur est
opérationnelle.
Imaginons maintenant que suite à une mauvaise mise à jour, vim
soit inutilisable. Notre commande générique éditeur devient donc
inexploitable. Nous allons corriger la chose en la faisant pointer vers un
autre clone de vi : nvi.
$ update-alternatives --config éditeur
There are 3 alternatives which provide `éditeur'.
Selection Alternative
-----------------------------------------------
*+ 1 /usr/bin/vim
2 /usr/bin/nvi
3 /usr/bin/vi
Press enter to keep the default[*], or type selection number:
Rentrons 2 pour choisir nvi.
Using `/usr/bin/nvi' to provide `éditeur'.
$ update-alternatives --display éditeur
éditeur - status is manual.
link currently points to /usr/bin/nvi
/usr/bin/vim - priority 9
/usr/bin/nvi - priority 2
/usr/bin/vi - priority 1
Current `best' version is /usr/bin/vim.
On découvre ici que vim est bien notre logiciel appelé, et que
la gestion du groupe est passée en manual. Ce qui veut dire que
l'on n'utilise pas nécessairement l'alternative ayant la plus haute priorité
(qui reviendrait dans notre cas à utiliser vim, ce que nous
refusons de faire car celui-ci étant indisponible).
Pour revenir à vim, on repasse par l'option
--config.
$ update-alternatives --config éditeur
There are 3 alternatives which provide `éditeur'.
Selection Alternative
-----------------------------------------------
+ 1 /usr/bin/vim
* 2 /usr/bin/nvi
3 /usr/bin/vi
Press enter to keep the default[*], or type selection number:
Répondons 1 et constatons :
Using `/usr/bin/vim' to provide `éditeur'.
Il est temps de reconfier au système la gestion automatique des alternatives
du groupe et de voir en quoi cela est une Bonne Idée.
$ update-alternatives --auto éditeur
Il est bien sur possible de retirer une redirection si un logiciel vient à
être désinstallé. Examinons cette possibilité pour vi.
$ update-alternatives --remove éditeur /usr/bin/vi
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vim - priority 9
/usr/bin/nvi - priority 2
Current `best' version is /usr/bin/vim.
Notre commande éditeur fait toujours appel à vim,
et vi ne fait plus partie du groupe. De la même façon, si nous
retirons l'alternative active, le système prendra automatiquement (d'où
l'intérêt du mode auto :) l'alternative restante ayant la plus
grande priorité.
$ update-alternatives --remove éditeur /usr/bin/vim
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/nvi
/usr/bin/nvi - priority 2
Current `best' version is /usr/bin/nvi.
Finalement, comme nous sommes des gens très propres, nous allons supprimer
le groupe, remettant tout en l'état.
$ update-alternatives --remove-all éditeur
$ update-alternatives --display éditeur
No alternatives for éditeur.
Durant toutes ces manipulations, il est possible de corriger une entrée
précédente en l'écrasant par la nouvelle. Pratique pour changer le chemin
d'accès d'un fichier déplacé. Bien entendu, si la mauvaise manipulation a été à
l'origine de la création d'un nouveau groupe, la solution qui s'impose est de
détruire complètement ce groupe.
La seule méthode actuelle permettant de connaître la liste des alternatives
mises en place est de lister le répertoire les contenant. Notez au passage que
c'est une très mauvaise idée que d'effectuer directement des
modifications dans le contenu de ce répertoire.
$ ls /etc/alternatives/
Pour aller plus loin, il est possible de créer des sous-groupes au sein d'un
groupe. Par exemple, pour lier des logiciels à leurs manuels. Ce qui
reviendrait à fournir dynamiquement le bon manuel à l'utilisateur en cas
d'appel.
Ainsi, nous aurions les couples suivants :
usr/bin/vim et /usr/share/man/man1/vim.1.gz
/usr/bin/nvi et /usr/share/man/man1/nvi.1.gz
/usr/bin/vi et /usr/share/man/man1/vi.1.gz
Pour se faire, on rajoutera l'option --slave lors de la
définition de l'alternative. La syntaxe suit celle de l'option
--install.
$ update-alternatives --install /bin/éditeur éditeur /usr/bin/vim 9 \
--slave /usr/share/man/man1/éditeur.1.gz éditeur.1.gz /usr/share/man/man1/vim.1.gz
$ update-alternatives --install /bin/éditeur éditeur /usr/bin/nvi 2 \
--slave /usr/share/man/man1/éditeur.1.gz éditeur.1.gz /usr/share/man/man1/nvi.1.gz
$ update-alternatives --install /bin/éditeur éditeur /usr/bin/vi 1 \
--slave /usr/share/man/man1/éditeur.1.gz éditeur.1.gz /usr/share/man/man1/vi.1.gz
Le résultat correspond à notre attente. En changeant d'alternative, on
modifie non seulement le logiciel appelé, mais également son manuel. Un vrai
bonheur.
$ update-alternatives --display éditeur
éditeur - status is auto.
link currently points to /usr/bin/vim
/usr/bin/vi - priority 1
slave éditeur.1.gz: /usr/share/man/man1/vi.1.gz
/usr/bin/nvi - priority 2
slave éditeur.1.gz: /usr/share/man/man1/nvi.1.gz
/usr/bin/vim - priority 9
slave éditeur.1.gz: /usr/share/man/man1/vim.1.gz
Current `best' version is /usr/bin/vim.
La commande update-alternatives fourni encore d'autres possibilités, mais
cela dépasse le cadre de cette simple documentation. Voir donc le manuel pour
de plus amples informations: update-alternatives(8)
Références
♻ Ils parlent