De acuerdo a las páginas de man:
update-alternatives – Gestión de enlaces simbólicos que determinan órdenes predefinidas
La idea del artículo Parchear archivo binario de dwm con xxd y HT Editor era enumerar un par de herramientas que en algún caso pudieran ser de utilidad para depurar o parchear alguna aplicación en particular. A raíz de ese artículo es que decidí indagar más en profundidad sobre el rol que cumple x-terminal-emulator, o cualquier paquete que tenga esta interesante función.
Verán; el parcheo, aunque fue un mero experimento es prácticamente ilógico —al menos en ese caso puntual—. El porqué, simplemente le quitaba dinámica a la aplicación en sí. x-terminal-emulator no es un paquete binario como tal, solo es un paquete virtual. Es decir un nombre genérico, un simple enlace.
Las páginas de man lo describe así:
El nombre genérico no es un enlace simbólico directo a la alternativa seleccionada. En vez de esto, es un enlace simbólico a un nombre en el directorio de alternativas («/etc/alternatives»), que a su vez es un enlace simbólico al fichero al que se hace referencia en realidad.
En pocas palabras un paquete virtual no es más que un comodín donde el usuario puede escoger de las alternativas que provee la que más le convenga. Dichas alternativas están establecidas en un cierto orden determinado por la distribución, no obstante se puede cambiar muy fácilmente. Por lo tanto es mucho mejor que un paquete virtual esté presente en una aplicación que reemplazarlo en alguna compilación.
Como usuario de Debian GNU/Linux, o alguna distro que deriva de esta, en algún momento me he visto en la necesidad de cambiar un editor por otro configurando las variables de entorno, o editar algún que otro archivo de configuración para cambiar el fondo de pantalla (inicio de sesión, grub), o sus respectivas dimensiones (/desktop/gnome/background/picture_options stretched ) etc.
En definitiva no es algo que no se deba hacer, todo lo contrario, siempre es bueno que el usuario tenga el control de su sistema. Sin embargo, cuando queda en manos del programa elegir la opción correcta en ocasiones no es lo que el usuario pudiera pretender. Es ahí donde la orden update-alternatives nos presenta una enorme flexibilidad en ese aspecto.
La orden update-alternatives
Lo primero que deberíamos saber es cuales son los paquetes virtuales (nombres genéricos) que presentan alternativas. Para ello ejecutamos en un terminal:
update-alternatives --get-selections | less
luego si nos interesa algún paquete virtual en particular escribimos:
sudo update-alternatives --config nombre_paquete
En varios casos habrá una alternativa p.ej.: la orden update-alternatives --config rxvt
podría dar la salida: Sólo hay una alternativa en el grupo de enlaces rxvt (provee /usr/bin/rxvt): /usr/bin/urxvt
Nada que configurar.
Utilizando update-alternatives
No son pocas las veces que he tenido que configurar el archivo sudoers mediante la orden visudo y en algunas distribuciones —salvo Debian— abren por omisión el editor vi o vim, ahora no representa un problema, pero en mis inicios con GNU/Linux me parecían algo ríspidos de manejar. Mi editor más fácil de utilizar en ese entonces era nano, por lo tanto configuraba el archivo sudoers a través de la orden EDITOR=nano visudo
.
Ahora vamos a suponer un caso inverso: ya que Debian tiene a nano como editor por omisión, yo quiero cambiar a vim —esto es por citar un ejemplo—. Además vim se ha convertido en mi editor para casi todo. Podemos hacer una listado de las alternativas disponibles, aunque no es estrictamente necesario. El nombre genérico del paquete virtual es obviamente editor: update-alternatives --list editor
De acuerdo a la imagen tenemos varios para elegir. Con la orden sudo update-alternatives --config editor
se nos desplegará un menú con todas las alternativas disponibles. Solo resta escoger la que deseamos, es importante que esta tarea la hagamos como superusuario:
nano está en modo automático. Los valores a la derecha representan el orden de prioridad. Si se desinstala un paquete que está presente como alternativa por omisión, de las restantes, update-alternatives configura como predeterminado a la que tiene el valor más alto (mayor prioridad). Las alternativas escogidas por el usuario quedan en modo manual.
Seleccioné la opción correspondiente a vim.basic ‘5’ y la próxima vez que ejecute el comando mostrará:
*5 /usr/bin/vim.basic 30 modo manual
Otro ejemplo concreto:
Si hay algo que solía hacer con frecuencia al instalar Debian era modificar el background del grub. Por defecto siempre me toma una proporción 4×3 cuando yo utilizo un monitor 16×9. Veamos que me depara: sudo update-alternatives --config desktop-grub
ahora puedo escoger de manera fácil las dimensiones del wallpaper, incluso tengo otros temas para elegir. Por omisión estaba en 4×3 (automático), seleccionando el ‘1’ obtuve el deseado 16×9 sin necesidad de configurar ningún archivo. Como ven no solo atañe a ejecutables, también se puede aplicar a otros formatos.
La siguiente imagen ilustra las alternativas del paquete virtual desktop-background:
Crear nuestro paquete virtual
Es posible que quisiéramos tener nuestro propio paquete virtual con una serie de alternativas. Hay una forma básica de hacerlo, aunque se puede aumentar la complejidad vamos a atenernos a lo sencillo.
Suponiendo el siguiente escenario de ejemplo: tengo una aplicación gráfica con algunas métricas y además me muestra un visor de procesos top en una caja empotrada. Se podría modificar el código fuente de esa aplicación reemplazando top por un nombre genérico: rmonitor —ese ve a ser mi enlace o paquete virtual que seleccionará mis alternativas—. Una vez resuelto el cambio se compila.
La sinopsis de nuestro comando:
––install enlace nombre ruta prioridad
donde:
por lo tanto la configuración quedaría de la siguiente forma:
enlace: /usr/bin/rmonitor (cuando ejecute rmonitor en la terminal o lo llame la aplicación se desplegará la alternativa seleccionada).
nombre: rmonitor
ruta: La ruta de los archivos binarios (htop, top…).
prioridad: 50, 40, 30, 20.
Mis alternativas serán: htop (omisión), top, nmon, atop. Con permisos de superusuario ejecutamos:
sudo update-alternatives --install /usr/bin/rmonitor rmonitor /usr/bin/htop 50 ... sudo update-alternatives --install /usr/bin/rmonitor rmonitor /usr/bin/nmon 30 ... ...
Ahora, no es estrictamente necesario que una aplicación tenga que contener el paquete virtual sí o sí, podría ejecutar rmonitor en la terminal como si fuera una aplicación normal y me abrirá htop, a menos que cambie a otra alternativa.
También hay ciertas aplicaciones como ranger, mc u otras que tienen su propio editor empotrado. En ese caso si quisiera cambiar a otro editor tendría que modificar sus respectivos archivos de configuración, es lo normal, no obstante lo puedo hacer con un nombre genérico que engloba los editores que más utilizo. De esta forma cuando selecciono un editor por omisión mediante la orden de update-alternatives, se cambiará para todas las aplicaciones aludidas.
Remover una o todas las alternativas
Una alternativa por vez.
sinopsis:
––remove nombre ruta
Donde nombre es el nombre en el directorio de alternativas y ruta es el nombre absoluto del fichero al que nombre se podría enlazar.
Removiendo atop:
sudo update-alternatives --remove rmonitor /usr/bin/atop
Todas las alternativas asociadas a un nombre (genérico) en el directorio /etc/alternatives
sinopsis:
––remove-all nombre
sudo update-alternatives --remove-all rmonitor
Puedes comprobar los cambios con cualquiera de estos comandos (rmonitor debe ser reemplazado por tu paquete virtual): sudo update-alternatives --display rmonitor
, sudo update-alternatives --query rmonitor
o los mencionados al comienzo del artículo.
Hay mucho más sobre esta herramienta. Ejecuta update-alternatives --help
, o man update-alternatives
para obtener información detallada.
Fuente:
Páginas de man
https://www.debian.org/doc/manuals/debian-reference/index.es.html
Ummm … una pequeña corrección, no sólo es de distros propias con APT, en otras existe también.
Hola teratux:
Muchas gracias por la aclaración, no me percaté de que pudiera figurar con otro nombre en otras distros. Además en openSUSE figura como update-alternatives. Estaba equivocado al afirmar que esta herramienta es propia de distros de APT solamente.
Edité la información del artículo.
Saludos.