¿Mejor manera de agregar alternativas usando las alternativas de actualización?

16

He buscado el manual update-alternativesvarias veces, pero no puedo descubrir cómo mostrar el enlace actual que apunta a una alternativa específica, y esa información es necesaria al agregar una nueva alternativa.

Del update-alternativesmanual:

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

Digamos que quiero agregar una nueva versión de Java Runtime Edition, pero no sé el enlace simbólico actual que enlaza con la alternativa ( <link>parámetro). Lo que hago actualmente es:

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

Ese comando generará:

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

Al leer el resultado, descubro el enlace anterior que apuntaba a la alternativa, por lo que finalmente puedo ejecutar mi comando nuevamente con el <link>parámetro correcto , cambiando /tmp/randomStuffa /usr/local/bin/java:

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

Eso funciona bien, pero como puede ver, ejecutar el comando con /tmp/randomStuffel <link>parámetro es muy incómodo.

Entonces, aquí vienen las preguntas: (1) ¿Hay algún update-alternativeargumento que pueda generar el enlace actual que apunta a una alternativa específica, o (2) hay una manera de instalar una nueva alternativa sin tener que proporcionar un nuevo parámetro, simplemente manteniendo la corriente <link>?

pagliuca
fuente

Respuestas:

13

Para responder a su primera pregunta, me gustaría insinuarle que --query:

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

Armado con esto, obtendrá la fuente del enlace, por ejemplo, en mi caso para Java:

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

Entonces, ves que mi cadena sigue así /usr/bin/java -> /etc/alternatives/java -> ....

Lamentablemente, no tengo una respuesta a su segunda pregunta. He estado buscando una solución para esto hace algún tiempo, pero parece que todavía no hay una solución simple. Lo que podría hacer es escribir algún truco para analizar la salida de la --queryllamada, tal vez así:

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

que luego podría usar como entrada para la --installllamada. Pero dado que esto es bastante complicado en mi opinión, no lo recomendaré. En cambio, es posible que desee ver galternativesun front-end para el sistema de alternativas. Incluso si no me gusta usar material gráfico para trabajos tan básicos, es bastante conveniente y terminé usando esta herramienta en lugar de las herramientas de línea de comandos.

EDITAR

He tenido curiosidad por update-alternativessaber cuál es el enlace simbólico del comando y he echado un vistazo a las fuentes. Por supuesto, el sistema de alternativas tiene que almacenar la configuración para cada grupo y resulta que se llama directorio administrativo y está escrito en la página del manual ;-)

Encontrará esta información en /var/lib/dpkg/alternatives(por defecto). La segunda línea en cada uno de estos archivos define el enlace maestro que está buscando. Puedes extraerlo así:

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

Sin embargo, esto es solo una solución para aquellos que tienen una versión anterior de update-alternatives.

binfalse
fuente
Gracias por responder, pero la versión de las alternativas de actualización que estoy ejecutando (1.16.1.2) no muestra la información del enlace usando --query o --display. Qué versión estás 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
He 1.16.10instalado ¿No puedes actualizar tu versión?
binfalse
¡Tu eres el hombre! Ambas soluciones son excelentes!
pagliuca
6

Pregunta <link>simple aquí: ¿No será siempre el mismo recuperado por un simple which [program]ya que ese es el enlace que el sistema usa para llamar a un programa por línea de comandos?

Por ejemplo, rastreando los enlaces para pycharm obtengo:

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*

Y luego puedo usar:

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

Para mi nueva instalación de pycharm.

Entonces, tal vez podría construir un script para usar la salida de which.

martshal
fuente
Gracias por el consejo, pero hay momentos en que eso no será útil. También uso update-alternativespara hacer un seguimiento de los complementos de Java y Flash para Firefox, y siempre olvido la ruta "/ usr / lib / mozilla / plugins" donde debo colocar esos complementos. No puedo encontrar esa ruta usando whicho whereiscualquier comando que se me ocurra, mientras que la respuesta de @binfalse devuelve correctamente esa ruta en mi máquina cuando corro update-alternatives --query java-plugin.
pagliuca