Tutoriales

Creación de diálogos GUI en Bash Scripts usando Whiptail

Hace algún tiempo, hablamos brevemente sobre zen, un programa sencillo que le permite crear cuadros de diálogo gráficos (GTK+) en la línea de comandos y en scripts de shell.En este artículo, discutiremos otra utilidad GUI llamada cola de látigo Se puede usar para crear cuadros de diálogo GUI en scripts Bash en Linux.

No todos los scripts que escribe requieren una interfaz gráfica frontal. Pero a veces es mejor si crea una interfaz gráfica en lugar de depender de la interacción con la línea de comandos. En mi caso, si se requiere una larga lista de respuestas en el guión, elijo usar la interfaz gráfica.

Whiptail es una utilidad GUI amigable que usa salamandra biblioteca de programación. Whiptail proporciona diferentes diálogos para diferentes propósitos. Dependiendo de su caso de uso, puede usar estos cuadros de diálogo para hacer que sus scripts sean más interactivos.

Instalar Whiptail en Linux

Whiptail viene preinstalado con muchas distribuciones, pero si su distribución no tiene instalado Whiptail, siga las instrucciones a continuación para instalarlo.

Para verificar si la cola de látigo ya está instalada, ejecute el siguiente comando.

$ which whiptail

Para instalar Whiptail en Debian/Ubuntu y sus distribuciones derivadas, ejecute el siguiente comando:

$ sudo apt install whiptail -y

Fedora/RHEL/CnetOS/AlmaLinux/Rocky Linux:

$ sudo dnf install newt

Arco Linux, EndeavourOS, Manjaro Linux:

$ sudo pacman -S whiptail

Linux alpino:

$ apk add newt

opciones de ayuda

puedes usarlo --help bandera, que mostrará una lista de cuadros de diálogo admitidos y otras opciones disponibles para usted. Hay un total de 10 cuadros de diálogo que admiten varias funciones, y los cubriremos en las siguientes secciones.

$ whiptail -help
Box options: 
    --msgbox   
    --yesno    
    --infobox   
    --inputbox    [init] 
    --passwordbox    [init] 
    --textbox   
    --menu     [tag item] ...
    --checklist     [tag item status]...
    --radiolist     [tag item status]...
    --gauge    

1. Cuadro de mensaje

El cuadro de mensaje mostrará un mensaje al usuario y esperará a que el usuario presione o llave.cuando presionas arrojará un código de retorno 0 si presionas arrojará código de retorno 255.

$ whiptail --title "Welcome Message" --msgbox "Howdy, Welcome to OSTechnix.." 8 78
Caja de mensaje

Vamos a decodificar el comando anterior.

– título Esto agregará un título a la ventana.
-msgbox Esto imprimirá el mensaje que proporcionaste entre comillas.
8 78 Esto establece la altura (8) y el ancho (78) de la ventana.

Puede abrir una nueva terminal y examinar el proceso de cola de látigo. Estará en estado de reposo.Significado – esperando que presiones o .

$ ps -ef | grep -i whiptail 
karthick   20023    9251  0 22:41 pts/0    00:00:00 whiptail --title Welcome Message --msgbox Howdy, Welcome to OSTechnix.. 8 78 
karthick   20071   19379  0 22:41 pts/1    00:00:00 grep --color=auto -i whiptail 
$ ps -q 20023 -o state --no-headers 
S 

notas: condición(pequeña) -> suspensión interrumpible (esperando que se complete el evento).

2. Cuadro de información

La información es similar a un cuadro de mensaje, pero la diferencia es que el cuadro de información del cuadro de mensaje no espera la entrada del usuario.utilizar –-infobox etiquetar y pasar una cadena como parámetro, que se mostrará en el cuadro de información.

En algunos shells, el cuadro de información se ejecuta sin mostrar ningún resultado. Tienes que cambiar la emulación de tu terminal y ejecutarla como lo hice en el fragmento a continuación.

$ TERM=ansi whiptail --title "Welcome Message" --infobox "Howdy, Welcome to OSTechnix.." 8 78 
ventana de mensajes
ventana de mensaje

3. Casilla Sí/No

El cuadro Sí/No mostrará un cuadro de diálogo o No opción, si eliges arrojará regreso codigo 0 cuando presionas arrojará código de retorno 1.

utilizar --yesno firme para solicitar la selección. Ejecute el siguiente fragmento de código, que combina un cuadro de sí/no y un cuadro de mensaje. Primero, mostrará opciones de sí/no y, dependiendo de su elección, arrojará un código de retorno.

Cree un script de shell, copie el fragmento de código a continuación y ejecútelo.

#!/usr/bin/env bash

whiptail --title "CONFIRMATION" --yesno "Should I proceed" 8 78 
if [[ $? -eq 0 ]]; then 
  whiptail --title "MESSAGE" --msgbox "Process completed successfully." 8 78 
elif [[ $? -eq 1 ]]; then 
  whiptail --title "MESSAGE" --msgbox "Cancelling Process since user pressed ." 8 78 
elif [[ $? -eq 255 ]]; then 
  whiptail --title "MESSAGE" --msgbox "User pressed ESC. Exiting the script" 8 78 
fi 
diálogo sí/no
diálogo sí/no

Si no sabe nada acerca de los condicionales bash, use el siguiente enlace para consultar nuestro breve artículo.

4. Cuadro de texto

El cuadro de texto leerá e imprimirá el archivo.En el fragmento a continuación, estoy leyendo ostechnix.txt documento. La bandera –scrolltext le permite desplazarse verticalmente con la rueda del mouse cuando hay páginas largas de texto que no caben en la ventana actual.

$ whiptail --textbox --scrolltext ostechnix.txt 10 80
caja de texto
caja de texto

5. Redirigir

El cuadro de diálogo que verá en las siguientes secciones solicita almacenar la salida en una variable para su posterior procesamiento. El valor de retorno del widget se envía a stderr en lugar de a stdout. Entonces, debe intercambiar stdout y stderr para que el resultado se almacene en una variable.

Debe usar las siguientes expresiones para intercambiar la salida estándar y el error estándar.

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

Tratemos de entender la expresión anterior. Sabe que FD1 es una salida estándar y FD2 es un error estándar.

  • 3>&1 – Todo lo que se redirija al descriptor de archivo 3 se redirigirá al descriptor de archivo 1.
  • 1>&2 – Cualquier cosa enviada al descriptor de archivo 1 (Stdout) se redirige al descriptor de archivo 2.
  • 2>&3 – Cualquier cosa enviada al descriptor de archivo 2 (stderr) se redirige al descriptor de archivo 3.

De esta forma, intercambiamos stdout y stderr, para que la variable pueda almacenar el valor de retorno del diálogo.

6. Caja fuerte

Mediante el cuadro de diálogo de contraseña, puede escribir una contraseña que no aparece como texto sin formato a medida que escribe.utilizar --passwordbox Solicitar una contraseña.

$ whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password"
diálogo de contraseña
diálogo de contraseña

cuando presionas si ejecuta desde la terminal, arrojará un código de retorno de 0 y devolverá la contraseña que escribió a la consola (stderr).

producción
producción

Debe capturar la contraseña en una variable y luego usarla en el script. Como se mencionó en la sección de redirección, debe redirigir el resultado.

$ PASSWORD=$(whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password" 8 78 3>&1 1>&2 2>&3)
$ echo "The password entered by the user is $PASSWORD"
almacenar la salida en una variable
almacenar la salida en una variable

7. Cuadro de entrada

Un cuadro de diálogo de entrada le pedirá al usuario que ingrese. Al igual que con el cuadro de diálogo de contraseña, si lo ejecuta desde la terminal, la entrada que proporcione se imprimirá en la terminal. Debe usar la redirección y almacenar el valor en una variable y luego usarlo para procesar de acuerdo con la lógica de su programa.

NEW_USER=$(whiptail --title "Create New User" --inputbox "Username to be created" 8 40 3>&1 1>&2 2>&3)
Cuadro de entrada
Cuadro de entrada
almacenar salida a variable
almacenar salida a variable

También puede establecer el texto de entrada predeterminado. Todo lo que tiene que hacer es agregar texto después de la altura y el ancho.A continuación se muestra la sintaxis donde en lugar de [init] Colocarás el texto por defecto.

--inputbox    [init]

ejemplo:

whiptail --title "Create New User" --inputbox "Username to be created" 8 40 noname
texto predeterminado
texto predeterminado

Ahora escribamos un programa simple de creación de usuarios que combine cuadros de entrada, cuadros de contraseña, cuadros de sí/no y cuadros de texto, y veamos cómo acoplar estos cuadros de diálogo.

8. Diálogo de lista

Las listas de verificación le permiten crear una lista de opciones entre las que los usuarios pueden elegir.

--checklist     [tag item status]...

Lo anterior es la sintaxis para crear un diálogo de manifiesto.debes usar --checklist seguido de establecer la altura y el ancho del cuadro de diálogo.

Opciones Especifique cuántas listas desea crear.Cada lista se marcará Establézcalo en ENCENDIDO o APAGADO. On apunta a una lista de selección, Off apunta a una lista sin selección.

$ whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" ON

Para seleccionar una lista, presione la barra espaciadora y use las flechas hacia arriba y hacia abajo para moverse entre las listas. Presione Entrar cuando haya terminado.

diálogo de lista
diálogo de lista

Puede almacenar la salida en una matriz y usarla más tarde. Los nombres de la etiqueta («Chrome, pip3, ksnip, virtualbox») se imprimirán como salida a stderr según la selección.

SELECTED=($(whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" ON 3>&1 1>&2 2>&3))
$ echo ${SELECTED[@]} # Array of values

Salida de muestra:

"pip3" "ksnip" "virtualbox"

Si no sabe nada sobre arreglos bash, tenemos un artículo detallado sobre arreglos bash. Te sugiero que le eches un vistazo al siguiente enlace.

9. Diálogo de lista de radio

Un cuadro de diálogo de lista de opción única es similar a un cuadro de diálogo de lista, pero la única diferencia es que solo puede seleccionar una opción de la lista. Sintácticamente, una lista de radio y un manifiesto son lo mismo.

--radiolist     [tag item status]...

ejemplo:

SELECTED=$(whiptail --title "Choose Only One Package" --radiolist \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" OFF 3>&1 1>&2 2>&3)
solo botón
solo botón
$ echo $SELECTED
virtualbox

10. Diálogo de menú

Los diálogos de menú son similares a los diálogos de botones de opción.Creo que la única diferencia es que en el cuadro de diálogo del botón de opción tienes que presionar Seleccione un elemento de la lista y presione Entrar. Pero en el cuadro de diálogo del menú, puede presionar enter para devolver el nombre de la etiqueta a stderr.

La sintaxis es similar a la lista y los botones de radio, pero la única diferencia es que no es necesario activar/desactivar la opción «estado» en el cuadro de diálogo del menú.

--menu     [tag item]

ejemplo:

TO_RUN=$(whiptail --title "Menu example" --menu "Choose an option" 25 78 5 \
"backup" "Start taking defined backup" \
"restore" "restore from last backup" \
"Schedule" "Display active backup schedules" 3>&1 1>&2 2>&3)
diálogo de menú
diálogo de menú
$ echo $TO_RUN 
backup

11. Barra de progreso

Para crear una barra de progreso, debe usar la siguiente sintaxis. Primero, pasará un texto que se imprimirá cuando se ejecute la barra de progreso, y establecerá la altura y el ancho de la ventana y el porcentaje de progreso.

--gauge    

El porcentaje de progreso será controlado por nuestra lógica. Eche un vistazo al fragmento de código a continuación. Redirijo el ciclo while a la barra de progreso e incremento la variable COUNTER en 10 conteos, que se usarán como porcentaje de progreso.

#!/usr/bin/env bash

COUNTER=0
while [[ ${COUNTER} -le 100 ]]; do
  sleep 1
  COUNTER=$(($COUNTER+10))
  echo ${COUNTER} 
done | whiptail --gauge "Running Data Loader" 6 50 ${COUNTER}

La barra de progreso se incrementará en 10.

cuadro de diálogo de la barra de progreso
cuadro de diálogo de la barra de progreso

En conclusión

Hemos llegado al final de este artículo. Aquí, analizamos brevemente cómo usar Whiptail para crear varios diálogos en un script bash. Si ha usado whiptail y tiene algún truco bajo esclavo, puede compartirlo con nosotros a través del área de comentarios.

recurso:

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba