Entendiendo Update-Alternatives Unix
Configurar udpate alternatives, parece complejo pero realmente es una tarea sencilla, ya que realmente lo unico que hace por detras es gestionar link simbolicos.
De esta forma podemos cambiar facilmente de versiones de un programa u otro ejecutable sin tener que hacer una tediosa tarea (como suele seer cambiar la maquina virutal de java, etc..)
Vamos a ver un ejemplo sencillo con distintas versiones de un mismo programa que vamos a llamar danielusV{versionNumber}.sh
vamos a crear la carpeta /tmp/danielus/
>$ mkdir /tmp/danielus
>$ cd /tmp/danielus
y dentro crea 3 ejecutables (imagina que son distintas versiones del programa)
El primer ejecutable:
>$ touch danielusV1.sh
>$ vi danielusV1.sh
Introducimos este contenido:
echo "Welcome to Danielus V1 Program. Your first arg is $1"
>$ chmod +x ./danielusV1.sh
El segundo ejecutable:
>$ cd /tmp/danielus
>$ touch danielusV2.sh
>$ vi danielusV2.sh
Introducimos este contenido:
#!/bin/bash
echo "This is the Danielus V2 Program. Your first arg is $1"
>$ chmod +x ./danielusV2.sh
El tercer ejecutable:
>$ cd /tmp/danielus
>$ touch danielusV3.sh
>$ vi danielusV3.sh
Introducimos este contenido:
#!/bin/bash
echo "Welcome to the Amazing Danielus Software V2 . Your first arg is $1"
>$ chmod +x ./danielusV3.sh
Ahora solo falta darlos de alta como un programa "danielus" generico y añadirle alternativas, de forma que siempre ejecutaremos "danielus", pero segun tengamos configuradas las alternatives
pues correrar uno u otro:
1.Vamos a instalarla version 1,
dpena@ /tmp/danielus () $ sudo update-alternatives --install "/usr/bin/danielus" "danielus" "/tmp/danielus/danielusV1.sh" 1
update-alternatives: utilizando /tmp/danielus/danielusV1.sh para proveer /usr/bin/danielus (danielus) en modo automático
dpena@ /tmp/danielus () $
Si vemos la sintaxis, le estamos diciendo que meta un ejecutable en una de las rutas de nuestro path (/usr/bin siempre esta incluida) y que le ponga de nombre danielus y que realmente lo que se ejecute es /tmp/danielus/danielusV1. El ultimo numero es la prioridad y orden de listado, no tiene mucha importancia, pero cuando querramos editar indicando que se debe ejecutar cuando escribamos "danielus" nos va a pedir ese numero.
Si ahora en cualquier directorio ejecutamos "danielus", (este ejecutable sera encontrado en el PATH ) pero el script real que se ejecuta es donde esta apuntando el link simbolico danielusV1.sh
Vamos a probar:
dpena@ /tmp/danielus () $ danielus hola
Welcome to Danielus V1 Program. Your first arg is hola
dpena@ /tmp/danielus () $
Muy bien pues vamos a dar de alta las otras versiones del ejecutable "danielus", la V2 y la V3:
dpena@ /tmp/danielus () $ sudo update-alternatives --install "/usr/bin/danielus" "danielus" "/tmp/danielus/danielusV2.sh" 2
update-alternatives: utilizando /tmp/danielus/danielusV2.sh para proveer /usr/bin/danielus (danielus) en modo automático
dpena@ /tmp/danielus () $ sudo update-alternatives --install "/usr/bin/danielus" "danielus" "/tmp/danielus/danielusV3.sh" 3
update-alternatives: utilizando /tmp/danielus/danielusV3.sh para proveer /usr/bin/danielus (danielus) en modo automático
dpena@ /tmp/danielus () $
Ya tenemos danielusV1.sh, danielusV2.sh y danielusV3.sh como opciones para configurar el ejecutable global "danielus".
Vamos a jugar con ellos, vamos a configurar que sea el V2, abrimos el menu de esta manera:
>sudo update-alternatives --config danielus
Y se muestra un listado que nos pide que numero queremos que responda cuando se ejecute "danielus"
dpena@ /tmp/danielus () $ sudo update-alternatives --config danielus
Existen 3 opciones para la alternativa danielus (que provee /usr/bin/danielus).
Selección Ruta Prioridad Estado
------------------------------------------------------------
* 0 /tmp/danielus/danielusV3.sh 3 modo automático
1 /tmp/danielus/danielusV1.sh 1 modo manual
2 /tmp/danielus/danielusV2.sh 2 modo manual
3 /tmp/danielus/danielusV3.sh 3 modo manual
Press <enter> to keep the current choice[*], or type selection number:
Escribo "2" y pulso enter:
y ahora pruebo a ejectar "danielus" pasandole un argumento:
dpena@ /tmp/danielus () $ danielus hola
This is the Danielus V2 Program. Your first arg is hola
dpena@ /tmp/danielus () $
como podemos ver, ahora se esta ejecutando la V2, pero la instruccion que ejecuto "danielus" es siempre la misma.
Pues aqui tenemos la magia de los update-alternatives. Una solucion limpia y elegante para manejar distintas versiones de ejecutables, manteniendo nuestro path intacto.
De esta forma podemos cambiar facilmente de versiones de un programa u otro ejecutable sin tener que hacer una tediosa tarea (como suele seer cambiar la maquina virutal de java, etc..)
Vamos a ver un ejemplo sencillo con distintas versiones de un mismo programa que vamos a llamar danielusV{versionNumber}.sh
vamos a crear la carpeta /tmp/danielus/
>$ mkdir /tmp/danielus
>$ cd /tmp/danielus
y dentro crea 3 ejecutables (imagina que son distintas versiones del programa)
El primer ejecutable:
>$ touch danielusV1.sh
>$ vi danielusV1.sh
Introducimos este contenido:
#!/bin/bashecho "Welcome to Danielus V1 Program. Your first arg is $1"
>$ chmod +x ./danielusV1.sh
El segundo ejecutable:
>$ cd /tmp/danielus
>$ touch danielusV2.sh
>$ vi danielusV2.sh
Introducimos este contenido:
#!/bin/bash
echo "This is the Danielus V2 Program. Your first arg is $1"
>$ chmod +x ./danielusV2.sh
El tercer ejecutable:
>$ cd /tmp/danielus
>$ touch danielusV3.sh
>$ vi danielusV3.sh
Introducimos este contenido:
#!/bin/bash
echo "Welcome to the Amazing Danielus Software V2 . Your first arg is $1"
>$ chmod +x ./danielusV3.sh
Ahora solo falta darlos de alta como un programa "danielus" generico y añadirle alternativas, de forma que siempre ejecutaremos "danielus", pero segun tengamos configuradas las alternatives
pues correrar uno u otro:
1.Vamos a instalarla version 1,
dpena@ /tmp/danielus () $ sudo update-alternatives --install "/usr/bin/danielus" "danielus" "/tmp/danielus/danielusV1.sh" 1
update-alternatives: utilizando /tmp/danielus/danielusV1.sh para proveer /usr/bin/danielus (danielus) en modo automático
dpena@ /tmp/danielus () $
Si vemos la sintaxis, le estamos diciendo que meta un ejecutable en una de las rutas de nuestro path (/usr/bin siempre esta incluida) y que le ponga de nombre danielus y que realmente lo que se ejecute es /tmp/danielus/danielusV1. El ultimo numero es la prioridad y orden de listado, no tiene mucha importancia, pero cuando querramos editar indicando que se debe ejecutar cuando escribamos "danielus" nos va a pedir ese numero.
Si ahora en cualquier directorio ejecutamos "danielus", (este ejecutable sera encontrado en el PATH ) pero el script real que se ejecuta es donde esta apuntando el link simbolico danielusV1.sh
Vamos a probar:
dpena@ /tmp/danielus () $ danielus hola
Welcome to Danielus V1 Program. Your first arg is hola
dpena@ /tmp/danielus () $
Muy bien pues vamos a dar de alta las otras versiones del ejecutable "danielus", la V2 y la V3:
dpena@ /tmp/danielus () $ sudo update-alternatives --install "/usr/bin/danielus" "danielus" "/tmp/danielus/danielusV2.sh" 2
update-alternatives: utilizando /tmp/danielus/danielusV2.sh para proveer /usr/bin/danielus (danielus) en modo automático
dpena@ /tmp/danielus () $ sudo update-alternatives --install "/usr/bin/danielus" "danielus" "/tmp/danielus/danielusV3.sh" 3
update-alternatives: utilizando /tmp/danielus/danielusV3.sh para proveer /usr/bin/danielus (danielus) en modo automático
dpena@ /tmp/danielus () $
Ya tenemos danielusV1.sh, danielusV2.sh y danielusV3.sh como opciones para configurar el ejecutable global "danielus".
Vamos a jugar con ellos, vamos a configurar que sea el V2, abrimos el menu de esta manera:
>sudo update-alternatives --config danielus
Y se muestra un listado que nos pide que numero queremos que responda cuando se ejecute "danielus"
dpena@ /tmp/danielus () $ sudo update-alternatives --config danielus
Existen 3 opciones para la alternativa danielus (que provee /usr/bin/danielus).
Selección Ruta Prioridad Estado
------------------------------------------------------------
* 0 /tmp/danielus/danielusV3.sh 3 modo automático
1 /tmp/danielus/danielusV1.sh 1 modo manual
2 /tmp/danielus/danielusV2.sh 2 modo manual
3 /tmp/danielus/danielusV3.sh 3 modo manual
Press <enter> to keep the current choice[*], or type selection number:
Escribo "2" y pulso enter:
y ahora pruebo a ejectar "danielus" pasandole un argumento:
dpena@ /tmp/danielus () $ danielus hola
This is the Danielus V2 Program. Your first arg is hola
dpena@ /tmp/danielus () $
como podemos ver, ahora se esta ejecutando la V2, pero la instruccion que ejecuto "danielus" es siempre la misma.
Pues aqui tenemos la magia de los update-alternatives. Una solucion limpia y elegante para manejar distintas versiones de ejecutables, manteniendo nuestro path intacto.
Comentarios
Publicar un comentario