Puede usar ventanas GUI, controles deslizantes, botones de radio, barras de progreso y más en sus scripts de Bash. Aprenda a usar el kit de herramientas de zenity y renueve sus scripts de Bash. Le mostraremos cómo.
Las secuencias de comandos Bash son un poderoso lenguaje de programación y, debido a que está integrado en el shell Bash, está fácilmente disponible para todos. Es un lenguaje fácil para comenzar a programar. Debido a que está interpretado, no necesita compilar sus scripts. Tan pronto como haya editado el archivo de script y lo haya ejecutable, puede ejecutarlo. Esto hace que el ciclo de codificación, ejecución y depuración sea bastante eficiente.
Hay dos quejas principales que las personas tienen con los scripts de Bash, y la primera es la velocidad. Debido a que el shell Bash interpreta los comandos en el script, no se ejecutan tan rápido como el código compilado. Sin embargo, esto es como quejarse de que un tractor no es tan rápido como un automóvil; están destinados a diferentes cosas.
Sin embargo, hay dos tipos de velocidad. A menudo puede juntar un script rápido y usarlo para realizar una tarea mucho más rápido que desarrollar una solución en un lenguaje compilado, como C.
La segunda queja que las personas tienen con los scripts Bash es la interfaz de usuario —Es una ventana de terminal. Por supuesto, a veces la interfaz no importa. Si la única persona que usará el script es su autor, la interfaz probablemente no sea tan importante. Tampoco importa para los scripts que realizan el procesamiento en segundo plano y tipo de lote. Por lo general, estos scripts no necesitan mucha (si es que la hay) interacción del usuario.
Hay ocasiones en las que necesita algo un poco más intuitivo y moderno que la ventana del terminal. La mayoría de las personas están familiarizadas con una interfaz gráfica de usuario (GUI). Para brindar a las personas una experiencia lo más sencilla posible, debe crear y utilizar elementos de la GUI a partir de sus scripts.
La aplicación zenity
zenity le permite incorporar una amplia gama de elementos de interfaz gráfica en sus scripts de Bash. Es un poderoso kit de herramientas que le da a sus scripts una sensación moderna y una apariencia familiar y contemporánea.
zenity está preinstalado en las distribuciones de Ubuntu, Fedora y Manjaro. Es parte de GNOME. Si usa KDE, es posible que desee consultar kdialog, aunque zenity se ejecuta en cualquier entorno de escritorio.
Los ejemplos en este artículo le muestran cómo crear las diferentes ventanas de diálogo desde la línea de comandos, cómo para capturar sus valores de retorno y selecciones de usuario en variables, y cómo usar las ventanas de diálogo en scripts.
Terminamos con una pequeña aplicación que hace uso de los tres tipos de ventanas de diálogo.
La ventana de diálogo del calendario
Una ventana de diálogo del calendario le permite a alguien seleccionar una fecha. Para crear uno con zenity se requiere un solo comando de dos palabras:
zenity --calendar
Aparece la ventana de diálogo del calendario. Esto tiene toda la funcionalidad que esperaría de un selector de fecha estándar. Puede cambiar el mes y el año, y hacer clic en un día para seleccionar esa fecha. De forma predeterminada, la fecha de hoy se resalta cuando aparece la ventana.
Haga clic en "Aceptar" para cerrar la ventana de diálogo y seleccionar la fecha resaltada. Hacer doble clic en una fecha hace lo mismo.
Si no desea hacer una selección de fecha, haga clic en “Cancelar”, presione la tecla “Esc” en su teclado o cierre la ventana de diálogo.
En el ejemplo anterior, se selecciona el 19 de agosto de 2019. Si el usuario hace clic en "Aceptar", el calendario se cierra y la fecha seleccionada se imprime en la ventana del terminal.
Puede ignorar la línea, "GTKDialog asignado sin un padre transitorio. . Esto se desaconseja. ”
GTK significa GIMP Tool Kit, que es el conjunto de herramientas utilizado para desarrollar la interfaz GNOME. Fue ideado originalmente por los autores del Programa de manipulación de imágenes GNU (GIMP). GNU significa GNU No es Unix.
El motor GTK está advirtiendo a los autores de zenity que han usado un componente GTK de una manera no estándar.
Capturando el valor de la fecha
Imprimir la fecha en el terminal no nos ayuda mucho. Si vamos a llamar a este calendario desde uno de nuestros scripts, necesitamos capturar el valor de fecha seleccionado para que podamos hacer algo útil con él en nuestro script. También personalizaremos ligeramente el calendario.
Usaremos las siguientes opciones con el calendario. Todos deben usarse con el indicador de doble guión “-”:
- –text: especifica una cadena de texto para mostrar en el calendario. Reemplaza el valor predeterminado, "Seleccione una fecha a continuación".
- –title: establece el título de la ventana de diálogo del calendario.
- –day: establece el día seleccionado cuando el calendario se abre.
- –mes: establece el mes seleccionado cuando se abre el calendario.
- –año: establece el año que se selecciona cuando se abre el calendario.
Estamos utilizando una variable llamada ChosenDate para capturar la fecha devuelta desde el calendario. Y estamos usando echo $ ChosenDate para imprimir esa fecha en la ventana del terminal.
Sí, logramos el mismo resultado en el ejemplo anterior, pero aquí, tenemos la fecha seleccionada almacenada en una variable. En el ejemplo anterior, se imprimió y se olvidó.
ChosenDate = $ (zenity - calendar --text "Choose a date" --title "How-To Geek Rota" --day 1 - mes 9 - año 2019); echo $ ChosenDate
Ahora, el calendario muestra nuestro mensaje y el título de nuestra ventana. La fecha se establece en nuestra fecha de inicio elegida en lugar de la fecha de hoy.
También podemos personalizar el formato de la cadena de fecha devuelta cuando se realiza una selección. La opción --date-format debe ir seguida de un especificador de formato. Esta es una cadena de tokens que definen los datos y formatos que se incluirán en la salida. Los tokens son los mismos que los utilizados con la función de lenguaje strftime () C y hay una gran selección de ellos.
Los tokens que estamos usando son:
- % R: El nombre completo del día de la semana.
- % d: El día del mes como un dígito.
- % m: El mes como un dígito.
- % y: El año como dos dígitos (sin siglo).
ChosenDate = $ (zenity - calendar --text "Choose a date" --title "How-To Geek Rota" --date-format = "% A% d /% m /% y" - día 1 - mes 9 - año 2019); echo $ ChosenDate
Alguien selecciona una fecha:
Y la fecha se devuelve usando nuestro formato. Muestra el nombre del día de la semana, seguido de la fecha en orden europeo: día, mes, año.
La ventana de diálogo de selección de archivo: Elegir un archivo
Las ventanas de diálogo de selección de archivos son bastante complejas. Las personas pueden navegar a través del sistema de archivos, resaltar un archivo o archivos, y luego hacer clic en "Aceptar" para seleccionar esos archivos o cancelar la selección por completo.
zenity proporciona toda esta funcionalidad y más. Y es tan fácil de usar como la ventana de diálogo del calendario.
Las nuevas opciones que vamos a usar son:
- –file-selection: le dice a zenity que queremos utilizar una ventana de diálogo de selección de archivo.
- –múltiple: permite que alguien seleccione más de un archivo.
- –file-filter: le dice a la ventana de diálogo de archivo qué tipos de archivo mostrar.
zenity --file-selection --tile "How-To Geek" --multiple --file-filter = '*. mm * .png * .page *. sh * .txt '
La ventana de diálogo de selección de archivos es tan funcional como cualquier otra ventana de selección de archivos.
El usuario puede navegar por el sistema de archivos y seleccionar el archivo de su elección.
Hemos navegado a un nuevo directorio y seleccionado un archivo llamado "button_hybrid.png".
Cuando hace clic en "Aceptar", se cierra la ventana del cuadro de diálogo de selección de archivos y se imprime el nombre de archivo y la ruta en la ventana del terminal.
Si necesita para usar el nombre de archivo en cualquier procesamiento posterior, puede capturarlo en una variable, tal como lo hizo para la fecha del calendario.
La ventana de diálogo de selección de archivo: Guardar un archivo
Si agregamos una opción, podemos Convierta la ventana de diálogo de selección de archivos en una ventana de diálogo para guardar archivos. La opción es --save. También vamos a utilizar la opción --confirmar-sobrescribir. Esto hace que la persona confirme que desea sobrescribir un archivo existente.
Response = $ (zenity --file-selection --save --confirm-overwrite); echo $ Response
Aparece la ventana de diálogo para guardar el archivo. Tenga en cuenta que hay un campo de texto donde alguien puede escribir un nombre de archivo.
El usuario puede buscar la ubicación que elija dentro del sistema de archivos, proporcionar un nombre para el archivo o hacer clic en un archivo existente para sobrescribirlo.
En en el ejemplo anterior, el usuario resaltó un archivo existente.
Cuando hace clic en "Aceptar", aparece una ventana de diálogo de confirmación pidiéndole que confirme que desea reemplazar el archivo existente. Tenga en cuenta que el nombre del archivo aparece en el cuadro de diálogo de advertencia. Ese es el tipo de atención al detalle que le da a zenity su apariencia profesional.
Si no hubiéramos usado la opción --confirmar-sobrescribir, el archivo se habría sobrescrito en silencio.
El nombre del archivo se almacena en la variable Respuesta, que se imprime en la ventana del terminal.
Ventana de diálogo de notificaciones
Con zenity, incluir ventanas de diálogo de notificación ingeniosas en sus scripts es fácil. Hay ventanas de diálogo de stock a las que puede recurrir para proporcionar información, advertencias, mensajes de error y preguntas para el usuario.
Para crear una ventana de diálogo de mensaje de error, use el siguiente comando:
zenity --error --width 300 --text "Permiso denegado. No se puede escribir en el archivo".
Las nuevas opciones que estamos usando son:
- < li> –error: le dice a zenity que queremos usar una ventana de diálogo de error.
- –width: establece el ancho inicial de la ventana.
La ventana de diálogo de error aparece en el ancho especificado. Utiliza el icono de error GTK estándar.
Para crear una ventana de diálogo de información, use el siguiente comando:
zenity --info - -width 300 --text "Actualización completa. Haga clic en Aceptar para continuar".
La nueva opción que estamos usando es --info, que le dice a zenity que cree una ventana de diálogo de información.
Para crear una ventana de diálogo de preguntas, use el siguiente comando:
zenity --question --width 300 --text "¿Está contento de continuar? "; echo $?
La nueva opción que estamos usando es --question, que le dice a zenity que cree una ventana de diálogo de preguntas.
El $? Es un parámetro especial. Contiene el valor de retorno de la canalización en primer plano ejecutada más recientemente. En términos generales, este es el valor del proceso cerrado más recientemente. Un valor cero significa "OK", y un valor de uno o más significa "Cancelar".
Esta es una técnica general que puede aplicar a cualquiera de las ventanas de diálogo de zenity. Al marcar este valor en su script, puede determinar si los datos devueltos desde una ventana de diálogo deben procesarse o ignorarse.
Hicimos clic en "Sí", por lo que el código de retorno es un cero que indica "OK".
Para crear una ventana de diálogo de advertencia, use el siguiente comando:
zenity --warning - -título "Espacio bajo en el disco duro" - ancho 300 --texto "Puede que no haya suficiente espacio en el disco duro para guardar la copia de seguridad".
La nueva opción que estamos usando es --warning, que le dice a zenity que cree una ventana de diálogo de advertencia.
Aparece la ventana de diálogo de advertencia. No es una pregunta, por lo que solo tiene un botón.
La ventana de diálogo de progreso
Puede usar la ventana de diálogo de progreso de zenity para mostrar un progreso barra que indica qué tan cerca está la finalización de su secuencia de comandos.
La barra de progreso se avanza de acuerdo con los valores que se ingresan desde su secuencia de comandos. Para demostrar el principio, use el siguiente comando:
(para i en $ (seq 0 10 100); echo $ i; sleep 1; hecho)
El comando se desglosa así:
- El comando seq avanza a través de una secuencia de 0 a 100, en pasos de 10.
- En cada paso, el valor se almacena en la variable i. Esto se imprime en la ventana del terminal.
- El comando se detiene por un segundo, debido al comando de suspensión.
Podemos usar esto con la ventana de diálogo de progreso zenity para demostrar la barra de progreso. Tenga en cuenta que estamos canalizando la salida del comando anterior en zenity:
(para i en $ (seq 0 10 100); echo $ i; sleep 1; hecho) | zenity --progress --title "How-To Geek" - cierre automático
Las nuevas opciones que estamos usando son:
- < li> –progress: le dice a zenity que queremos usar una ventana de diálogo de progreso.
- –auto-close: cierra el diálogo cuando la barra de progreso alcanza el 100 por ciento.
Aparece la ventana de diálogo de progreso, y la barra avanza hacia el 100 por ciento, haciendo una pausa de un segundo entre cada paso.
Podemos usar ese concepto de valores de tubería en zenity para incluir la ventana de diálogo de progreso en un script.
Ingrese este texto en un editor y guárdelo como "progress.sh".
! / bin / bash function work -list () {echo "# Primer elemento de trabajo" echo "25" sleep 1 echo "# Segundo elemento de trabajo" echo "50" sleep 1 echo "# Tercer elemento de trabajo" echo "75" sleep 1 echo "# Último elemento de trabajo "echo" 100 "sleep 1} lista de trabajo | zenity --progress --title "How-To Geek" --auto-close exit 0
Aquí hay un desglose del script:
- El script define una función llamada lista de trabajo Aquí es donde pones tus comandos e instrucciones para realizar un trabajo real. Reemplace cada uno de los comandos sleep 1 con los reales.
- zenity acepta las líneas de eco "# ..." y las muestra en la ventana de diálogo de progreso. Cambie el texto de estas líneas para que pasen mensajes informativos al usuario.
- Las líneas de eco que contienen números, como echo "25", también son aceptadas por zenity y establecen el valor de la barra de progreso .
- Se llama a la función de lista de trabajo y se canaliza a zenity.
Use este comando para hacer que el script sea ejecutable:
chmod + x progress.sh
Utilice este comando para ejecutar el script:
./ progress.sh
El script se ejecuta y el mensaje de texto cambia a medida que se ejecuta cada fase del script. La barra de progreso se mueve en pasos hacia el 100 por ciento.
La ventana de diálogo de escala
La ventana de diálogo de escala le permite a alguien mover un control deslizante para elegir un valor numérico . Esto significa que no puede ingresar un valor que sea demasiado alto o bajo.
Las nuevas opciones que estamos usando son:
- –scale: le dice a zenity que queremos usar una ventana de diálogo de escala.
- –min-value: establece el valor mínimo para la escala.
- –max-value: establece el valor máximo para la escala. < li> –step: establece la cantidad de movimiento del control deslizante cuando se usan las teclas de flecha. Esto no afecta los movimientos del control deslizante si alguien usa el mouse.
- –value: establece el valor inicial y la posición del control deslizante.
Este es el comando que ' re usar:
Response = $ (zenity --scale --title "How-To Geek" --text "Select magnification." --min-value = 0 --max-value = 30 - paso = 3 --valor15); echo $ Response
La ventana de diálogo del control deslizante aparece con el control deslizante establecido en 15.
El usuario puede mover el control deslizante para seleccionar un nuevo valor.
Cuando hace clic en "Aceptar", el valor se transfiere a la variable Respuesta y se imprime en la ventana del terminal.
La ventana de diálogo de entrada
La ventana de diálogo de entrada permite que alguien ingrese texto.
Las nuevas opciones que estamos usando son:
- –entry: le dice a zenity que queremos usar una ventana de diálogo de entrada.
- –entry-text: puede usar esto si desea escribir un valor sugerido en el campo de entrada de texto. Estamos usando "" para forzar un campo vacío. Esto no es estrictamente necesario, pero queríamos documentar la opción.
El comando completo se ve así:
Response = $ (zenity - entrada --texto "Ingrese su término de búsqueda" --título "Howe-To Geek" --entry-text = ""); echo $ Response
Aparece una ventana de diálogo simple que contiene un campo de entrada de texto.
Alguien puede escribir y editar texto.
Cuando hace clic en "Aceptar", el valor que escribió se asigna a la variable Respuesta. Usamos echo para imprimir el valor de la variable en la ventana de terminal.
Poniendo todo junto
Vamos a juntar estas técnicas y crear un funcional guión. El script realizará un escaneo de información de hardware y presentará los resultados al usuario en una ventana de texto desplazable. Puede elegir un tipo de escaneo largo o corto.
Para este script, usaremos tres tipos de ventanas de diálogo, dos de las cuales son nuevas para nosotros:
- El primero es una ventana de diálogo de lista. Le permite a alguien tomar una decisión.
- La segunda es una ventana de diálogo de progreso que le permite al usuario saber que algo está sucediendo, y debe esperar.
- La tercera es una ventana de información de texto , que muestra los resultados al usuario.
Ingrese este texto en un editor y guárdelo como "hardware-info.sh".
#! / bin / bash # Muestra la lista de hardware para esta computadora TempFile = $ (mktemp) ListType = `zenity --width = 400 --height = 275 --list --radiolist \ --title 'Hardware Scan' \ --text 'Seleccione el tipo de escaneo:' \ --column 'Seleccione' \ --column 'Tipo de escaneo' VERDADERO "Corto" FALSO "Largo" `if [[$? -eq 1]]; luego # presionaron Cancelar o cerraron la ventana de diálogo zenity --error --title = "Scan Declined" --width = 200 \ --text = "Escaneo de hardware omitido" exit 1 elif [$ ListType == "Short"]; luego # seleccionaron el botón de opción corto Flag = "- short" else # seleccionaron el botón de opción largo Flag = "" fi # buscar información de hardware con el valor apropiado en $ Flag hwinfo $ Flag | tee > (zenity --width = 200 --height = 100 \ --title = "Intercalando información" --progress \ --pulsate --text = "Comprobando hardware ..." \ --auto-kill - cierre automático) > $ # Muestra la información del hardware en una ventana de desplazamiento zenity --width = 800 --height = 600 \ --title "Detalles del hardware" \ --text-info --filename = "$" salida 0
Use este comando para hacerlo ejecutable:
chmod + x hardware-info.sh
Este script crea un archivo temporal y el nombre del archivo se guarda en la variable TempFile:
TempFile = $ (mktemp)
El script usa la opción --list para cree una ventana de diálogo zenity llamada ventana de diálogo de lista. Los caracteres "\" al final de las líneas le dicen al guión que los trate como una línea larga que se envuelve. Aquí está el proceso:
- Especificamos un ancho y alto para la ventana.
- La ventana de diálogo de lista admite columnas. La opción --radiolist hace que la primera columna sea una columna de botones de radio.
- Establecemos un título y texto para la ventana.
- Establecemos el título de la primera columna ser "Seleccionar". El contenido de esta columna serán los botones de opción.
- Establecemos el título de la segunda columna como "Seleccionar", y proporcionamos el contenido de la segunda columna. Esta columna contiene dos etiquetas de texto: "Corto" y "Largo". Los indicadores VERDADERO y FALSO significan que la opción "Corto" está seleccionada de forma predeterminada cuando aparece la ventana de diálogo.
- Estamos almacenando el resultado de esta ventana de diálogo en una variable llamada ListType.
ListType = `zenity --width = 400 --height = 275 --list --radiolist \ --title 'Hardware Scan '\ --text' Seleccione el tipo de escaneo: '\ --column' Seleccione '\ --column' Tipo de escaneo 'TRUE "Corto" FALSO "Largo" `
Si el usuario presiona“ Cancelar, "No necesitamos verificar el valor en ListType, simplemente podemos salir. Si presiona "Aceptar", debemos averiguar si seleccionó el botón de opción "Corto" o "Largo":
- El parámetro especial $? es igual a cero si el usuario presionó "OK". Es igual a uno si presionó "Cancelar" o cerró la ventana.
- Si es igual a uno, el script muestra una ventana de diálogo de información de error y sale. Si presiona "OK", pasamos a probar el valor en la variable ListType.
- Si la variable ListType contiene el valor "Short", el script establece una variable llamada Flag para que sea igual a "–short. "
- Si la variable ListType no contiene el valor" Short ", debe contener el valor" Long ". El script establece una variable llamada Flag para que sea igual a" ", que es una cadena vacía.
- El script usa la variable Flag en la siguiente sección.
if [[$? -eq 1]]; luego # presionaron Cancelar o cerraron la ventana de diálogo zenity --error --title = "Scan Declined" --width = 200 \ --text = "Escaneo de hardware omitido" exit 1 elif [$ ListType == "Short"]; luego # seleccionaron el botón de opción corto Flag = "- short" else # seleccionaron el botón de opción largo Flag = "" fi
Ahora que el script sabe qué tipo de exploración desea el usuario, podemos realice la exploración de información de hardware:
- El script llama al comando hwinfo y le pasa el valor en la variable Flag.
- Si Flag contiene "–short", el comando hwinfo realiza un escaneo corto. Si el valor de Flag es "", nada pasa a hwinfo y se realiza una exploración larga predeterminada.
- El script canaliza la salida de hwinfo a tee. tee envía la salida a zenity y TempFile.
- El script crea una ventana de diálogo de la barra de progreso. Establece el ancho y el alto de la ventana de diálogo, y el título y los textos de solicitud.
- El script no puede saber de antemano cuánta información producirá el comando hwinfo, por lo que no puede configurar la barra de progreso para avanzar correctamente al 100 por ciento. La opción --pulsate hace que el diálogo de progreso muestre un indicador en movimiento. Esto informa al usuario que algo está sucediendo y que debe esperar.
- La opción --auto-kill finaliza el script si alguien hace clic en "Cancelar".
- La opción --auto-close hace que el diálogo de progreso se cierre automáticamente cuando se completa el proceso que está supervisando.
# busca información de hardware con el valor apropiado en $ Flag hwinfo $ Flag | tee > (zenity --width = 200 --height = 100 \ --title = "Intercalando información" --progress \ --pulsate --text = "Comprobando hardware ..." \ --auto-kill - cierre automático) > $
Cuando se completa la exploración hwinfo, el script llama a zenity para crear una ventana de diálogo de información de texto con la opción --text-info. La ventana de diálogo de información de texto muestra el contenido del archivo TempFile:
- El script establece el ancho y alto de la ventana de diálogo y el texto del título.
- El nombre de archivo La opción se utiliza para leer el contenido del archivo contenido en la variable TempFIle.
# Muestra la información del hardware en una ventana de desplazamiento zenity --width = 800 --height = 600 \ --title "Hardware Details" \ --text-info --filename = "$"
Cuando el usuario cierra la ventana de diálogo de información de texto, el script se cierra.
[ PRE] salir 0
Vamos a encenderlo y echar un vistazo.
./ hardware-info.sh
Aparece el cuadro de lista. La opción "Corto" está seleccionada de forma predeterminada.
Seleccionemos "Largo" y luego haga clic en "Aceptar".
La ventana de progreso aparece con un indicador deslizante. Permanece en la pantalla hasta que se completa el escaneo de hardware.
Cuando se completa el escaneo de hardware, aparece la ventana de diálogo de información de texto con detalles del escaneo.
Haga clic en "Aceptar".
Incluso un jinete de línea de comandos tiene que admitir que un par de ventanas de diálogo de la GUI pueden darle un toque profesional a un humilde script de Bash .
Fuente: How to Geek
Comentarios
Publicar un comentario