Modo migliore per aggiungere alternative usando update-alternative?


16

Ho update-alternativesconsultato il manuale diverse volte ma non riesco a scoprire come mostrare il collegamento corrente che punta a una specifica alternativa e che sono necessarie informazioni quando si aggiunge una nuova alternativa.

Dal update-alternativesmanuale:

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

Diciamo che voglio aggiungere una nuova versione di Java Runtime Edition, ma non conosco l'attuale link simbolico che si collega all'alternativa ( <link>parametro). Quello che faccio attualmente è:

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

Quel comando produrrà:

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

Leggendo l'output scopro il vecchio link che puntava all'alternativa, così posso finalmente eseguire nuovamente il mio comando con il <link>parametro giusto , cambiando /tmp/randomStuffin /usr/local/bin/java:

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

Funziona bene, ma come vedi, eseguire il comando /tmp/randomStuffcome <link>parametro è molto imbarazzante.

Quindi, ecco le domande: (1) Esistono update-alternativeargomenti che possono generare il collegamento corrente che punta a una specifica alternativa, oppure (2) c'è un modo per installare una nuova alternativa senza dover fornire un nuovo parametro, semplicemente mantenere l'attuale <link>?

Risposte:


13

Per rispondere alla tua prima domanda, vorrei suggerirti di --query:

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

Grazie a questo otterrai la fonte del link, ad esempio nel mio caso per Java:

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

Quindi, vedi che la mia catena va come /usr/bin/java -> /etc/alternatives/java -> ....

Sfortunatamente, non ho una risposta alla tua seconda domanda. Ho cercato una soluzione per questo qualche tempo fa, ma sembra che non ci sia ancora una soluzione semplice. Quello che potresti fare è scrivere qualche hack per analizzare l'output della --querychiamata, forse in questo modo:

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

che è possibile utilizzare come input per la --installchiamata. Ma dal momento che questo è abbastanza disordinato secondo me non lo consiglio. Invece potresti voler dare un'occhiata galternatives, un front-end al sistema di alternative. Anche se non mi piace usare materiale grafico per tali lavori di base, è abbastanza conveniente e ho finito per usare questo strumento invece degli strumenti da riga di comando.

MODIFICARE

Sono stato curioso di update-alternativessapere qual è il comando symlink e ho dato un'occhiata alle fonti. Naturalmente il sistema alternativo deve memorizzare la configurazione per ogni gruppo e si scopre che si chiama directory amministrativa e scritto nella pagina man ;-)

Troverai queste informazioni in /var/lib/dpkg/alternatives(per impostazione predefinita). La seconda riga in ciascuno di questi file definisce il collegamento principale che stai cercando. Puoi estrarlo in questo modo:

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

Tuttavia, questa è solo una soluzione alternativa per coloro che hanno una versione precedente di update-alternatives.


Grazie per aver risposto, ma la versione di update-alternatives che sto eseguendo (1.16.1.2) non mostra le informazioni sui collegamenti senza usare --query o --display. Quale versione stai usando? 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,

Ho 1.16.10installato. Non riesci ad aggiornare la tua versione?
binfalse,

Tu sei l'uomo! Entrambe le soluzioni sono eccellenti!
pagliuca,

6

Domanda semplice qui: non <link>sarà sempre la stessa recuperata da un semplice which [program]poiché si tratta del collegamento che il sistema utilizza per chiamare un programma dalla riga di comando?

Ad esempio, tracciando i collegamenti per Pycharm ottengo:

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*

E quindi posso usare:

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

Per la mia nuova installazione di Pycharm.

Quindi forse potresti costruire uno script per usare l'output di which.


Grazie per il suggerimento, ma ci sono momenti in cui ciò non sarà utile. Uso update-alternativesanche per tenere traccia dei plugin java e flash per firefox e dimentico sempre il percorso "/ usr / lib / mozilla / plugins" dove dovrei mettere quei plugin. Non riesco a scoprire quel percorso usando whicho whereiso qualsiasi comando che mi viene in mente, mentre la risposta di @binfalse restituisce correttamente quel percorso sulla mia macchina quando corro update-alternatives --query java-plugin.
pagliuca
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.