Une meilleure façon d'ajouter une alternative en utilisant des alternatives de mise à jour?

16

J'ai consulté le manuel à update-alternativesplusieurs reprises mais je ne peux pas savoir comment afficher le lien actuel pointant vers une alternative spécifique, et ces informations sont nécessaires lors de l'ajout d'une nouvelle alternative.

Du update-alternativesmanuel:

--install <link> <name> <path> <priority>

Disons que je veux ajouter une nouvelle version de Java Runtime Edition, mais je ne connais pas le lien symbolique actuel qui renvoie à l'alternative ( <link>paramètre). Ce que je fais actuellement, c'est:

sudo update-alternatives --install /tmp/randomStuff java /usr/local/java/jre1.7.0_25/bin/java 0

Cette commande affichera:

update-alternatives: renaming java link from /usr/local/bin/java to /tmp/randomStuff.

En lisant la sortie, je découvre l'ancien lien qui pointait vers l'alternative, donc je peux enfin réexécuter ma commande avec le bon <link>paramètre, en changeant /tmp/randomStuffpour /usr/local/bin/java:

sudo update-alternatives --install /usr/local/bin/java java /usr/local/java/jre1.7.0_25/bin/java 0

Cela fonctionne bien, mais comme vous le voyez, exécuter la commande avec /tmp/randomStuffcomme <link>paramètre est très gênant.

Alors, voici les questions: (1) Y a-t-il des update-alternativearguments qui peuvent sortir le lien actuel qui pointe vers une alternative spécifique, ou (2) existe-t-il un moyen d'installer une nouvelle alternative sans avoir à fournir un nouveau paramètre, simplement garder le courant <link>?

pagliuca
la source

Réponses:

13

Pour répondre à votre première question, je voudrais vous suggérer de --query:

   --query name
          Display information about the link group like --display does, but in a machine parseable way (see section QUERY FORMAT below).

Armé de cela, vous obtiendrez la source du lien, par exemple dans mon cas pour java:

usr@srv % update-alternatives --query java
Name: java
Link: /usr/bin/java
[...]

Donc, vous voyez que ma chaîne va comme /usr/bin/java -> /etc/alternatives/java -> ....

Malheureusement, je n'ai pas de réponse à votre deuxième question. J'ai cherché une solution il y a quelque temps, mais il semble qu'il n'y ait pas encore de solution de contournement simple. Ce que vous pourriez faire, c'est écrire un hack pour analyser la sortie de l' --queryappel, peut-être comme ceci:

update-alternatives --query java | /bin/grep Link | cut -f 2 -d " "

que vous pourriez ensuite utiliser comme entrée pour l' --installappel. Mais comme c'est assez compliqué à mon avis, je ne le recommanderai pas. Au lieu de cela, vous voudrez peut-être jeter un œil à galternativesun frontal du système alternatif. Même si je n'aime pas utiliser des éléments graphiques pour de tels travaux de base, c'est assez pratique et j'ai fini par utiliser cet outil au lieu des outils de ligne de commande.

ÉDITER

J'ai été curieux de savoir update-alternativesquel est le lien symbolique de la commande et j'ai jeté un coup d'œil aux sources. Bien sûr, le système alternatif doit stocker la config pour chaque groupe et il s'avère qu'il s'appelle répertoire administratif et écrit sur la page de manuel ;-)

Vous trouverez ces informations dans /var/lib/dpkg/alternatives(par défaut). La deuxième ligne de chacun de ces fichiers définit le lien principal que vous recherchez. Vous pouvez l'extraire comme ceci:

usr@srv $ sed -ne 2p /var/lib/dpkg/alternatives/java
/usr/bin/java

Cependant, ce n'est qu'une solution de contournement pour ceux qui ont une ancienne version de update-alternatives.

binfalse
la source
Merci d'avoir répondu, mais la version des alternatives de mise à jour que j'utilise (1.16.1.2) n'affiche pas les informations de lien en utilisant ni --query ni --display. Quelle version utilisez-vous? sudo update-alternatives --query java Link: java Status: auto Best: /usr/local/java/jre1.6.0_45/bin/java Value: /usr/local/java/jre1.6.0_45/bin/java Alternative: /usr/local/java/jre1.6.0_45/bin/java Priority: 0
pagliuca du
J'ai 1.16.10installé. Vous ne pouvez pas mettre à jour votre version?
binfalse
Tu es l'homme! Les deux solutions sont excellentes!
pagliuca
6

Question simpleton ici: ne <link>va- t-il pas toujours être le même récupéré par un simple which [program]puisque c'est le lien que le système utilise pour appeler un programme par ligne de commande?

Par exemple, retrouver les liens pour pycharm que j'obtiens:

user@computer:~$ which pycharm
/usr/bin/pycharm
user@computer:~$ ll /usr/bin/pycharm
lrwxrwxrwx 1 root root 25 Mar 12  2015 /usr/bin/pycharm -> /etc/alternatives/pycharm*
user@computer:~$ ll /etc/alternatives/pycharm 
lrwxrwxrwx 1 root root 43 Mar 12  2015 /etc/alternatives/pycharm -> /opt/pycharm-community-4.0.5/bin/pycharm.sh*

Et je peux alors utiliser:

sudo update-alternatives --install /usr/bin/pycharm pycharm /opt/pycharm-community-4.5.0/bin/pycharm.sh 0

Pour ma nouvelle installation pycharm.

Ensuite, vous pourriez peut-être construire un script pour utiliser la sortie de which.

martshal
la source
Merci pour l'astuce, mais il y a des moments où cela ne sera pas utile. J'utilise update-alternativeségalement pour garder une trace des plugins java et flash pour Firefox, et j'oublie toujours le chemin "/ usr / lib / mozilla / plugins" où je devrais mettre ces plugins. Je ne peux pas trouver ce chemin à l'aide de whichou whereisou d'une commande qui me vient à l'esprit, tandis que la réponse de @binfalse renvoie correctement ce chemin sur ma machine lorsque j'exécute update-alternatives --query java-plugin.
pagliuca