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.
Tabla de Contenidos
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
$ whiptail --title "Welcome Message" --msgbox "Howdy, Welcome to OSTechnix.." 8 78
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
$ 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
3. Casilla Sí/No
El cuadro Sí/No mostrará un cuadro de diálogo sí o No opción, si eliges
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
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
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"
cuando presionas
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"
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)
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
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.
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)
$ 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
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)
$ 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.
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: