Tabla de contenido
En el mundo de la administración de sistemas, es común encontrarse con la necesidad de automatizar tareas a través de shell scripts. Sin embargo, a veces necesitamos hacer que estos scripts sean interactivos para facilitar la experiencia del usuario, especialmente en entornos donde no se dispone de una interfaz gráfica completa. Aquí es donde entran en juego herramientas como Dialog y Whiptail.
Tanto Dialog como Whiptail son herramientas que permiten crear interfaces gráficas simples y funcionales dentro de un terminal de texto. Estas herramientas son muy útiles para desarrollar menús, cuadros de diálogo, listas de selección, barras de progreso y mucho más. A lo largo de este artículo, te guiaremos a través de los conceptos básicos y ejemplos prácticos de ambas herramientas para que puedas utilizarlas en tus propios scripts.
¿Qué es Dialog?
Dialog es una herramienta de línea de comandos utilizada para generar cuadros de diálogo interactivos en terminales basados en texto. Es ampliamente utilizada en scripts de shell para crear menús interactivos, cuadros de confirmación, formularios, barras de progreso, entre otros.
Dialog permite a los usuarios interactuar con un script a través de una interfaz de usuario basada en texto, lo que es especialmente útil en entornos de servidores donde no se dispone de una interfaz gráfica completa.
Instalación de Dialog
Para instalar Dialog en una distribución basada en Debian o Ubuntu, simplemente ejecuta el siguiente comando:
sudo apt-get update sudo apt-get install dialog
Para distribuciones basadas en Red Hat como CentOS o Fedora:
sudo yum install dialog
Ejemplos básicos de Dialog
Cuadro de mensaje simple
Este ejemplo muestra un cuadro de mensaje simple que solo tiene un botón «OK»:
#!/bin/bash dialog --title "Mensaje" --msgbox "Hola, este es un cuadro de mensaje simple." 6 50 Explicación: En este script, --title define el título del cuadro de diálogo, --msgbox es el tipo de diálogo utilizado, "6 50" son las dimensiones del cuadro (6 líneas de alto y 50 caracteres de ancho).
Menú interactivo
El siguiente ejemplo crea un menú donde el usuario puede seleccionar una opción:
#!/bin/bash opcion=$(dialog --title "Menú Principal" --menu "Selecciona una opción:" 15 50 4 1 "Opción 1" 2 "Opción 2" 3 "Opción 3" 4 "Salir" 3>&1 1>&2 2>&3) clear echo "Has seleccionado la opción: $opcion"
Explicación: El menú se muestra con opciones numeradas. 3>&1 1>&2 2>&3 se utiliza para redirigir la selección del usuario de vuelta a la salida estándar.
Lista de selección
En este ejemplo, el usuario puede seleccionar uno o más elementos de una lista:
#!/bin/bash opciones=$(dialog --title "Selección de Paquetes" --checklist "Selecciona los paquetes que deseas instalar:" 15 50 5 1 "Apache" off 2 "MySQL" off 3 "PHP" off 4 "Python" off 5 "Java" off 3>&1 1>&2 2>&3) clear echo "Paquetes seleccionados: $opciones"
Explicación: –checklist crea una lista de elementos con casillas de verificación, donde off indica que la casilla está desmarcada por defecto.
Barra de progreso
Las barras de progreso son útiles para mostrar el avance de una tarea. Aquí tienes un ejemplo:
#!/bin/bash { for ((i = 0 ; i <= 100 ; i+=10)); do sleep 1 echo $i done } | dialog --title "Progreso" --gauge "Instalando..." 10 70 0
Explicación: –gauge se utiliza para crear una barra de progreso. El bucle for simula el avance de una tarea, incrementando la barra en un 10% cada segundo.
¿Qué es Whiptail?
Whiptail es una alternativa ligera a Dialog que también permite crear interfaces interactivas basadas en texto en scripts de shell. Aunque Whiptail ofrece un conjunto similar de funciones, es especialmente útil en sistemas donde Dialog no está disponible o donde se prefiere una herramienta más liviana.
Instalación de Whiptail
Para instalar Whiptail en Debian, Ubuntu y sus derivados:
sudo apt-get update sudo apt-get install whiptail
En distribuciones como CentOS, Red Hat y Fedora:
sudo yum install newt
Ejemplos básicos de Whiptail
Cuadro de mensaje simple
Al igual que con Dialog, puedes crear un cuadro de mensaje simple:
#!/bin/bash whiptail --title "Mensaje" --msgbox "Este es un mensaje simple usando Whiptail." 8 45
Explicación: Este ejemplo es similar al de Dialog, pero utilizando Whiptail. Las dimensiones del cuadro son ligeramente diferentes.
Menú interactivo
Crear menús interactivos es sencillo con Whiptail:
#!/bin/bash opcion=$(whiptail --title "Menú Principal" --menu "Elige una opción:" 15 50 4 \ "1" "Opción 1" \ "2" "Opción 2" \ "3" "Opción 3" \ "4" "Salir" 3>&1 1>&2 2>&3) clear echo "Has elegido la opción: $opcion"
Explicación: Este script funciona de manera similar al ejemplo de Dialog, permitiendo al usuario seleccionar una opción de un menú.
Lista de selección
Whiptail también permite crear listas de selección con casillas de verificación:
#!/bin/bash opciones=$(whiptail --title "Selección de Paquetes" --checklist "Selecciona los paquetes que deseas instalar:" 15 50 5 \ "Apache" "" ON \ "MySQL" "" OFF \ "PHP" "" OFF \ "Python" "" OFF \ "Java" "" OFF 3>&1 1>&2 2>&3) clear echo "Paquetes seleccionados: $opciones"
Explicación: En este ejemplo, «ON» indica que la casilla de verificación está marcada por defecto, a diferencia del «off» de Dialog.
Barra de progreso
Finalmente, aquí tienes un ejemplo de una barra de progreso con Whiptail:
#!/bin/bash { for ((i = 0 ; i <= 100 ; i+=10)); do sleep 1 echo $i done } | whiptail --gauge "Instalando..." 6 50 0
Explicación: Este ejemplo es muy similar al de Dialog, pero usando la sintaxis de Whiptail.
Tanto Dialog como Whiptail son herramientas poderosas y flexibles que permiten a los administradores de sistemas y desarrolladores crear interfaces de usuario interactivas dentro de un terminal. Aunque ambas herramientas son similares en funcionalidad, la elección entre una u otra puede depender de las necesidades específicas del sistema y las preferencias personales.
Dialog es más popular y ampliamente documentado, mientras que Whiptail es una alternativa más ligera que puede ser preferida en sistemas donde la minimización del uso de recursos es crucial.
En este artículo, hemos cubierto los conceptos básicos de Dialog y Whiptail con ejemplos prácticos que te permitirán comenzar a crear tus propios scripts interactivos. Ya sea que necesites un menú simple, un cuadro de mensaje o una barra de progreso, estas herramientas te proporcionarán las funcionalidades necesarias para mejorar la interacción de los usuarios con tus scripts.
Recuerda que la clave para dominar estas herramientas es la práctica. Prueba los ejemplos proporcionados, modifícalos para adaptarlos a tus necesidades, y continúa explorando las múltiples posibilidades que Dialog y Whiptail ofrecen para hacer que tus scripts sean más intuitivos y fáciles de usar.
Video
Script del video
A continuación pongo dos scripts de ejemplo de dos menús interactivos:
Dialog
#!/bin/bash # Ejemplo de menú usando Dialog dialog --menu "Seleccione una opción:" 15 50 4 \ 1 "Ver información del sistema" \ 2 "Mostrar uso del disco" \ 3 "Configurar red" \ 4 "Salir" 2>seleccion.txt # Leer la opción seleccionada opcion=$(cat seleccion.txt) case $opcion in 1) echo "Mostrando información del sistema..." # Aquí irían los comandos correspondientes ;; 2) echo "Mostrando uso del disco..." # Aquí irían los comandos correspondientes ;; 3) echo "Configurando la red..." # Aquí irían los comandos correspondientes ;; 4) echo "Saliendo..." exit 0 ;; *) echo "Opción no válida." ;; esac
El resultado sería:
Whiptail
#!/bin/bash # Ejemplo de menú usando Whiptail opcion=$(whiptail --title "Menú Principal" --menu "Seleccione una opción:" 15 50 4 \ "1" "Ver información del sistema" \ "2" "Mostrar uso del disco" \ "3" "Configurar red" \ "4" "Salir" 3>&1 1>&2 2>&3) # Verificar la opción seleccionada case $opcion in 1) echo "Mostrando información del sistema..." # Aquí irían los comandos correspondientes ;; 2) echo "Mostrando uso del disco..." # Aquí irían los comandos correspondientes ;; 3) echo "Configurando la red..." # Aquí irían los comandos correspondientes ;; 4) echo "Saliendo..." exit 0 ;; *) echo "Opción no válida." ;; esac
Con whiptail el resultado sería este otro:
Como se puede ver, los resultados son muy parecidos.
Referencias y documentación
Para dialog y whiptail podemos encontrar una amplia documentación en https://invisible-island.net/dialog/dialog.html