Inicio InformáticaGnu/Linux Whiptail, crea cuadros de diálogo GUI en Bash Scripts

Whiptail, crea cuadros de diálogo GUI en Bash Scripts

Publicado por entreunosyceros
Publicado el: Última actualización:

AVISO: Esta entrada tiene más de dos años desde su publicación. Es posible que el contenido esté desactualizado.

Una vez más aquí. En este artículo, vamos a echar un vistazo a una utilidad llamada Whiptail que se puede utilizar para crear cuadros de diálogo de GUI en scripts Bash en Gnu/Linux. Y como esto es algo que he tenido que utilizar recientemente, pues me decidí a dejar un pequeño artículo en el que vamos a ver algunos ejemplos básicos.

Cuando escribes un script, en ocasiones es mejor crear una interfaz gráfica en lugar de depender de la interacción con la terminal. Por eso, como Whiptail ofrece diferentes cuadros de diálogo para diferentes propósitos, es una buena opción que resulta interesante tener a mano. Además, dependiendo del caso de uso, podemos utilizar estos cuadros de diálogo para hacer que nuestra secuencia de comandos sea más interactiva y agradable para los usuarios.

Instalar Whiptail en Linux

Whiptail viene preinstalado con muchas distribuciones, como es el caso de Ubuntu. Pero si no cuentas con ella en Ubuntu, tan solo tienes que abrir una terminal (Ctrl+Alt+T) y ejecutar el comando:

sudo apt install whiptail

Opción de ayuda

Este programa cuenta con diferentes posibilidad. Todas ellas se pueden consultar en la opción de ayuda que nos ofrece. Para consultar esta ayuda, se puede utilizar en una terminal (Ctrl+Alt+T):

ayuda de whiptail
whiptail --help

Esta opción nos va a mostrar la lista de cuadros de diálogo admitidos y otras opciones que se puede utilizar. En total, hay 10 cuadros de diálogo compatibles con varias funciones. Aun que en este artículo no las veremos todas, pero casi ….

Cuadro de mensaje

El cuadro de mensaje mostrará mensajes al usuario y esperará hasta que el usuario presione la tecla <ok> o <ESC> . 

cuadro de mensaje
whiptail --title "Mensaje de bienvenida" --msgbox "Esto es un ejemplo de uso de Whiptail creado para entreunosyceros.net" 10 80

Cuadro de información

Cuadro de información

En este cuadro la información es similar al cuadro de mensaje, pero la diferencia es que el cuadro de información no esperará la entrada del usuario. Tan solo será necesario utilizar –-infobox y pasar una cadena como argumento, la cual se mostrará en el cuadro de información.

TERM=ansi whiptail --title "Mensaje de bienvenida" --infobox "Esto es un cuadro de información con Whiptail ..." 10 80 

Ventana Sí / No

La ventana Sí / No mostrará un cuadro de diálogo con la opción  o NO. Aquí elegimos Sí , el programa devolverá el código de retorno 0 y cuando pulsemos No, el valor devuelto será 1.

cuadro si / no

El siguiente código combina la ventana sí / no y el cuadro de mensaje. Al principio, veremos las opciones Sí / No y, dependiendo de la elección, nos mostrará el código de retorno.

Para ver este ejemplo de funcionamiento, vamos a crear un script de shell, copiar el siguiente fragmento y a ejecutarlo.

#!/usr/bin/env bash

whiptail --title "CONFIRMACIÓN" --yesno "¿Quieres proceder?" 10 80 
if [ $? -eq 0 ]; then 
  whiptail --title "MESSAGE" --msgbox "Has pulsado <SI>." 10 80 
elif [ $? -eq 1 ]; then 
  whiptail --title "MESSAGE" --msgbox "Has pulsado <NO>." 10 80 
fi 

Cuadro de texto

El cuadro de texto leerá imprimirá el contenido del archivo que le indiquemos. Para ejecutar este ejemplo, vamos a utilizar un archivo llamado ejemplo-whiptail.txt. La opción –scrolltext nos va a permitir utilizar la rueda del ratón para desplazarnos verticalmente cuando el texto que se va a mostrar en la ventana tiene páginas largas de texto que no caben en la ventana actual.

whiptail --textbox --scrolltext ejemplo-whiptail.txt 20 80

Redirecciones

Algunas de las posibilidades que nos ofrece Whiptail requieren que la salida se almacene en una variable y luego se use para el procesamiento del valor obtenido. El valor de retorno del widget se envía a stderr en lugar de a stdout. Entonces, debemos intercambiar stdout y stderr para que el resultado se almacene en la variable que indiquemos.

La expresión a utilizar para intercambiar stdout y stderr es la siguiente:

3>&1 1>&2 2>&3

De esta manera, estamos intercambiando stdout y stderr para que la variable pueda almacenar el valor de retorno de los cuadros de diálogo. En la expresión anterior:

  • 3>&1 : todo lo que se redirige al descriptor de archivo 3 se redirige al descriptor de archivo 1.
  • 1>&2 : todo lo que se envía al descriptor de archivo 1 (Stdout) se redirige al descriptor de archivo 2.
  • 2>&3 : todo lo que se envía al descriptor de archivo 2 (stderr) se redirige al descriptor de archivo 3.

Cuadro de contraseña

Con el cuadro de diálogo de contraseña podemos escribir contraseñas que se van a mostrar con asteriscos (*) a media que las escribamos. Tan solo es necesario añadir --passwordbox para solicitar al usuario que escriba la contraseña.

cuadro password
whiptail --title "ESTABLECE UNA CONTRASEÑA" --passwordbox "Escribe una contraseña segura" 10 80

Cuando pulsemos ok, el programa devolverá el código de retorno 0, además de devolver la contraseña que el usuario escribió a la consola (stderr) si se está ejecutando desde la terminal.

Esta contraseña se puede capturar en una variable para después utilizarla en el script. Es necesario redirigir el resultado.

Cuadro de diálogo Lista de verificación

La lista de verificación nos va a permitir crear una lista de opciones que el usuario puede seleccionar.

Como se puede ver a continuación, la sintaxis para crear un cuadro de diálogo de lista de verificación nos dice que es necesario utilizar --checklist y luego configurar la altura y el ancho del cuadro de diálogo que se va a mostrar.

--checklist <texto> <altura> <anchura> <lista> [tag item status]...

La opción listheight nos va a permitir especificar cuántas listas se van a crear. Cada lista se etiquetará con status la que está activada o desactivada. On apunta al elemento seleccionado y Off apunta lo deselecciona.

listado de paquetes
whiptail --title "SELECCIONA LOS PAQUETES PARA INSTALAR" --checklist \
"LISTA DE PAQUETES" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"filezilla" "Software FTP" ON

Para seleccionar una de las opciones, es necesario pulsar la barra espaciadora y usar las flechas hacia arriba y hacia abajo para moverse entre la lista. Una vez hecho esto, presione Intro.

La selección de salida se puede almacenar en una matriz para utilizarla después. Los nombres de las etiquetas se imprimirán como salida a stderr según la selección.

Cuadro de diálogo de menú

El cuadro de diálogo del menú es similar al anterior. La única diferencia visible es que en el caso anterior debíamos pulsar la barra espaciadora para seleccionar un elemento de la lista y luego presionar Intro. Pero en el cuadro de diálogo del menú, todo lo que debemos hacer es pulsar la tecla Intro, lo que devolverá el nombre de la etiqueta a stderr.

La sintaxis es similar al anterior caso, pero con la diferencia de que no es necesario activar/desactivar la opción «estado» en el cuadro de diálogo del menú.

--menu <texto> <altura> <anchura> <lista> [tag item]
TO_RUN=$(whiptail --title "MENÚ DE EJEMPLO" --menu "SELECCIONA UNA OPCIÓN" 25 78 5 \
"backup" "CREAR UNA COPIA DE SEGURIDAD" \
"restore" "RESTAURAR DESDE LA ÚLTIMA COPIA DE SEGURIDAD" \
"Schedule" "MOSTRAR LAS COPIAS DE SEGURIDAD" 3>&1 1>&2 2>&3)

En este caso, lo seleccionado se podría utilizar ejecutando la variable $TO_RUN:

echo $TO_RUN 

Barra de progreso

Para crear una barra de progreso, debe usar la siguiente sintaxis. En ella primero pasará un texto que se imprimirá cuando se ejecute la barra de progreso, y después establecerá la altura y el ancho de la ventana, seguido del porcentaje de progreso.

--gauge <texto> <altura> <anchura> <porcentaje>
barra de progreso

El porcentaje de progreso será controlado por nuestra lógica. En el código de ejemplo se redirige el bucle while a la barra de progreso e incrementando la variable COUNTER de 5 en 5, lo cual se utilizará como porcentaje de progreso.

COUNTER=0
while [ ${COUNTER} -le 100 ]; do
  sleep 1
  COUNTER=$(($COUNTER+5))
  echo ${COUNTER} 
done | whiptail --gauge "Cargador de datos en ejecución" 6 50 ${COUNTER}

Esto que acabamos de ver es tan solo un inicio básico de todo lo que este programa puede hacer por nosotros. Tan solo hemos visto de forma rápida cómo utilizar algunas de las posibilidades de Whiptail para crear varios cuadros de diálogo en nuestros scripts bash. Además de tener la posibilidad de utilizar la ayuda de Whiptail, también se puede obtener más información sobre su funcionamiento en Wikibooks.

También te puede interesar ...

Deja un comentario

* Al utilizar este formulario, aceptas que este sitio web almacene y maneje tus datos.

Adblock Detectado!!

Ayúdanos deshabilitando la extensión AdBlocker de tu navegador para visitar esta web.
Si no sabes hacerlo en Chrome, consulta el siguiente enlace. Si utilizas Firefox, puedes consultar este otro enlace.
Esto mejorará tu experiencia en este sitio web.