Damien Clauzel - Mot-clé - update-alternatives2024-03-27T11:37:53+01:00Damien Clauzelurn:md5:6728c0058bb2c4b2870d8dbd71b50f9eDotclearTutoriel pour update-alternativesurn:md5:40dbd237770d8f37ede422fef8d1d0842005-02-12T00:59:00+01:002021-07-26T10:06:21+02:00Damien ClauzelInformatiqueDebianGNU-linuxligne de commandesysadmintutorielupdate-alternatives <p>On désire proposer de façon générique un éditeur via la commande <code>éditeur</code>. 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 <code>browser</code> les logiciels <code>mozilla</code>, <code>firefox</code>, <code>galeon</code>, <code>dillo</code>, etc.</p>
<p>L'ensemble des commandes à gérer est rassemblé dans un groupe, que nous appellerons ici <code>éditeur</code>. De plus, on associe une priorité à chaque alternative du groupe. Lorsque le groupe est administré en mode <code>auto</code>, l'alternative employée est celle possédant la plus haute priorité.</p>
<p>Dans notre cas, nous avons les 3 éditeurs suivants que nous souhaiterions gérer derrière notre commande générique <code>/bin/éditeur</code>. Cette commande sera en fait un lien dynamique pointant vers l'un des 3 logiciels suivants :</p>
<ul>
<li><code>/usr/bin/vi</code></li>
<li><code>/usr/bin/vim</code></li>
<li><code>/usr/bin/nvi</code></li>
</ul>
<p>La première étape consiste à créer notre groupe <code>éditeur</code>.</p>
<pre class="brush: bash">$ 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.</pre>
<p>D'ailleurs, il est facile de le vérifier.</p>
<pre class="brush: bash">$ /bin/éditeur --version
VIM - Vi IMproved 6.3 (2004 June 7, compiled Jan 19 2005 08:10:19)</pre>
<p>Continuons, et rajoutons <code>nvi</code> à notre groupe. Nous lui mettrons la priorité <code>2</code>.</p>
<pre class="brush: bash">$ 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.</pre>
<p>Continuons encore, et rajoutons <code>vi</code> à notre groupe. Nous lui mettrons la priorité <code>1</code>, c'est à dire la plus faible.</p>
<pre class="brush: bash">$ 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.</pre>
<p>Notre groupe est désormais prêt. La commande <code>éditeur</code> est opérationnelle.</p>
<p>Imaginons maintenant que suite à une mauvaise mise à jour, <code>vim</code> soit inutilisable. Notre commande générique <code>éditeur</code> devient donc inexploitable. Nous allons corriger la chose en la faisant pointer vers un autre clone de <code>vi</code> : <code>nvi</code>.</p>
<pre class="brush: bash">$ 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:</pre>
<p>Rentrons <code>2</code> pour choisir <code>nvi</code>.</p>
<pre class="brush: bash">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.</pre>
<p>On découvre ici que <code>vim</code> est bien notre logiciel appelé, et que la gestion du groupe est passée en <code>manual</code>. 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 <code>vim</code>, ce que nous refusons de faire car celui-ci étant indisponible).</p>
<p>Pour revenir à <code>vim</code>, on repasse par l'option <code>--config</code>.</p>
<pre class="brush: bash">$ 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:</pre>
<p>Répondons <code>1</code> et constatons :</p>
<p><code>Using `/usr/bin/vim' to provide `éditeur'.</code></p>
<p>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.</p>
<p><code>$ update-alternatives --auto éditeur</code></p>
<p>Il est bien sur possible de retirer une redirection si un logiciel vient à être désinstallé. Examinons cette possibilité pour <code>vi</code>.</p>
<pre class="brush: bash">$ 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.</pre>
<p>Notre commande <code>éditeur</code> fait toujours appel à <code>vim</code>, et <code>vi</code> 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 <code>auto</code> :) l'alternative restante ayant la plus grande priorité.</p>
<pre class="brush: bash">$ 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.</pre>
<p>Finalement, comme nous sommes des gens très propres, nous allons supprimer le groupe, remettant tout en l'état.</p>
<pre class="brush: bash">$ update-alternatives --remove-all éditeur
$ update-alternatives --display éditeur
No alternatives for éditeur.</pre>
<p>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.</p>
<p>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 <strong>très</strong> mauvaise idée que d'effectuer directement des modifications dans le contenu de ce répertoire.</p>
<p><code>$ ls /etc/alternatives/</code></p>
<p>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.</p>
<p>Ainsi, nous aurions les couples suivants :</p>
<ul>
<li><code>usr/bin/vim</code> et <code>/usr/share/man/man1/vim.1.gz</code></li>
<li><code>/usr/bin/nvi</code> et <code>/usr/share/man/man1/nvi.1.gz</code></li>
<li><code>/usr/bin/vi</code> et <code>/usr/share/man/man1/vi.1.gz</code></li>
</ul>
<p>Pour se faire, on rajoutera l'option <code>--slave</code> lors de la définition de l'alternative. La syntaxe suit celle de l'option <code>--install</code>.</p>
<pre class="brush: bash">$ 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</pre>
<p>Le résultat correspond à notre attente. En changeant d'alternative, on modifie non seulement le logiciel appelé, mais également son manuel. Un vrai bonheur.</p>
<pre class="brush: bash">$ 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.</pre>
<p>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: <a href="http://www.delafond.org/traducmanfr/mdk/man8/update-alternatives.8.html" hreflang="fr">update-alternatives(8)</a></p>
<h3>Références</h3>
<ul>
<li><a href="http://www.delafond.org/traducmanfr/mdk/man8/update-alternatives.8.html" hreflang="fr">man update-alternatives(8)</a></li>
<li><a href="http://ftp.gnu.org/savannah/files/debfr-faq/html/debfr-faq014.html#toc92" hreflang="fr">FAQ de Debian</a></li>
</ul>https://damien.clauzel.eu/post/2005/02/12/Tutoriel-pour-update-alternatives#comment-formhttps://damien.clauzel.eu/feed/atom/comments/24