No todos los scripts que escribe necesitan una interfaz gráfica frontal. Pero a veces sería 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 hay una larga lista de respuestas necesarias en el guión, optaría por una interfaz gráfica.
Whiptail viene preinstalado con muchas distribuciones, pero si su distribución no tiene Whiptail instalado, siga las instrucciones a continuación para instalarlo.
Para verificar si la cola de látigo ya está instalada, ejecute el siguiente comando.
Para instalar Whiptail en Debian/Ubuntu y sus distribuciones derivadas, ejecute el siguiente comando:
El cuadro de mensaje mostrará mensajes al usuario y esperará hasta que el usuario presione o llave. Cuando presionas arrojará un código de retorno 0 y si presionas arrojará código de retorno 255 .
Vamos a decodificar el comando anterior.
--título | Esto agregará un título a la ventana |
--msgbox | Esto imprimirá el mensaje que proporcione entre comillas. |
8 78 | Esto establece la altura (8) y el ancho (78) de la ventana. |
Puede abrir una nueva terminal y verificar el proceso de cola de látigo. Estará en un estado de suspensión. Significado:está 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
NOTA: Estado (S ) -> suspensión interrumpible (esperando que se complete un evento).
2. Cuadro de información
La información es similar al cuadro de mensaje, pero la diferencia es que el cuadro de información del cuadro de mensaje no esperará la entrada del usuario. Usa –-infobox
marcar y pasar una cadena como argumento que se mostrará en el cuadro de información.
En algunos shells, el cuadro de información se ejecutará pero no mostrará ningún resultado. Tienes que cambiar la emulación de terminal y ejecutarla como lo hice en el siguiente fragmento.
$ TERM=ansi whiptail --title "Welcome Message" --infobox "Howdy, Welcome to OSTechnix.." 8 78
3. Casilla Sí/No
El cuadro Sí/No mostrará un cuadro de diálogo con SÍ o NO opción donde si elige lanzará return código 0 y cuando presiona arrojará código de retorno 1 .
Usa --yesno
bandera para solicitar la elección. Ejecute el siguiente fragmento de código que combina el cuadro sí/no y el cuadro de mensaje. Al principio, mostrará la opción Sí/No y, dependiendo de su elección, arrojará el código de retorno.
Cree un script de shell, copie el siguiente fragmento 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 <NO>." 8 78
elif [[ $? -eq 255 ]]; then
whiptail --title "MESSAGE" --msgbox "User pressed ESC. Exiting the script" 8 78
fi
Si no tiene idea acerca de las declaraciones condicionales de bash, eche un vistazo a nuestro breve artículo sobre el mismo utilizando el enlace a continuación.
- Secuencias de comandos de Bash:declaraciones condicionales
4. Cuadro de texto
El cuadro de texto leerá e imprimirá el archivo. En el siguiente fragmento, estoy leyendo el ostechnix.txt
expediente. La bandera –scrolltext le permite usar la rueda del mouse para desplazarse verticalmente cuando tiene páginas largas de texto que no caben en la ventana actual.
$ whiptail --textbox --scrolltext ostechnix.txt 10 80
5. Redirecciones
Los cuadros de diálogo que verá en la próxima sección requieren que la salida se almacene en una variable y luego se use para el 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 la variable.
Tienes que usar la siguiente expresión para intercambiar stdout y stderr.
3>&1 1>&2 2>&3
Tratemos de entender la expresión anterior. Sabe que FD1 es la salida estándar y FD2 es el error estándar.
- 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.
De esta manera, estamos intercambiando stdout y stderr para que la variable pueda almacenar el valor de retorno de los cuadros de diálogo.
6. Cuadro de contraseña
Con el cuadro de diálogo de contraseña, puede escribir contraseñas que no se mostrarán como texto sin formato a medida que las escribe. Usa --passwordbox
para solicitar que ingrese la contraseña.
$ whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password"
Cuando presionas , arrojará el código de retorno 0 y devolverá la contraseña que ingresó a la consola (stderr) si está ejecutando desde la terminal.
Debe capturar la contraseña en una variable y luego usarla en el script. Como se discutió en la sección 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"
7. Cuadro de entrada
El cuadro de diálogo de entrada le pedirá al usuario que proporcione la entrada. Al igual que con el cuadro de diálogo de contraseña, la entrada proporcionada por usted se imprimirá en la terminal si la está ejecutando desde la terminal. Debe usar las redirecciones y almacenar el valor en una variable y luego usarlo para procesarlo 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)
También puede establecer el texto de entrada predeterminado. Todo lo que tiene que hacer es agregar el texto después de la altura y el ancho. A continuación se muestra la sintaxis donde en lugar de [init]
colocará el texto predeterminado.
--inputbox <text> <height> <width> [init]
Ejemplo:
whiptail --title "Create New User" --inputbox "Username to be created" 8 40 noname
Ahora combinemos el cuadro de entrada, el cuadro de contraseña, el cuadro Sí/No y el cuadro de texto y escribamos un programa simple de creación de usuarios para ver cómo se pueden combinar estos cuadros de diálogo.
8. Cuadro de diálogo Lista de verificación
La lista de verificación le permite crear una lista de opciones que un usuario puede seleccionar.
--checklist <text> <height> <width> <listheight> [tag item status]...
Arriba está la sintaxis para crear un cuadro de diálogo de lista de verificación. Tienes que usar la --checklist
seguido de la configuración de la altura y el ancho del cuadro de diálogo.
La opción <listheight>
especifica cuántas listas vas a crear. Cada lista se etiquetará con <status>
que está configurado en ON u OFF. On apunta a la lista seleccionada y Off apunta a ninguna selección de lista.
$ 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 la lista. Una vez hecho esto, presione enter.
Puede almacenar la salida en una matriz y luego usarla. Los nombres de las etiquetas ("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 tiene idea acerca de las matrices bash, tenemos un artículo detallado sobre la matriz bash. Le sugiero que eche un vistazo al siguiente enlace.
- Bash Scripting - matriz indexada explicada con ejemplos
9. Cuadro de diálogo Lista de radio
El cuadro de diálogo de la lista de radio es similar al cuadro de diálogo de la lista de verificación, pero la única diferencia es que solo puede elegir una opción de la lista. Sintácticamente, tanto la lista de radio como la lista de verificación son lo mismo.
--radiolist <text> <height> <width> <listheight> [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)
$ echo $SELECTED
virtualbox
10. Cuadro de diálogo de menú
El cuadro de diálogo del menú es similar al cuadro de diálogo del botón de opción. La única diferencia que siento es que en el cuadro de diálogo del botón de opción debe presionar para seleccionar un elemento de la lista y luego presionar Intro. Pero en el cuadro de diálogo del menú, todo lo que tiene que hacer es presionar Intro, lo que devolverá el nombre de la etiqueta a stderr.
La sintaxis es similar a la lista de verificación y al botón de opción, pero la única diferencia es que no es necesario activar/desactivar la opción "estado" en el cuadro de diálogo del menú.
--menu <text> <height> <width> <listheight> [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)
$ 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 la barra de progreso se esté ejecutando y establecerá la altura y el ancho de la ventana seguido del porcentaje de progreso.
--gauge <text> <height> <width> <percent>
El porcentaje de progreso será controlado por nuestra lógica. Eche un vistazo al fragmento a continuación. Estoy redirigiendo el ciclo while a la barra de progreso e incrementando 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 la cuenta de 10.
Conclusión
Hemos llegado al final de este artículo. Aquí, hemos visto brevemente cómo usar Whiptail para crear varios cuadros de diálogo en scripts bash. Si ya has usado la cola de látigo y tienes algún truco debajo de la esclava, compártelo con nosotros a través de la caja de comentarios.