Cómo agregar una GUI a los scripts de Shell de Linux

Una ventana de información zenity iniciada desde una terminal de Ubuntu.

Puede usar ventanas GUI, controles deslizantes, botones de radio, barras de progreso y más en sus scripts Bash. Aprenda a usar el zenitykit de herramientas y renueve sus scripts Bash. Te mostraremos cómo.

El scripting Bash es un poderoso lenguaje de programación y, debido a que está integrado en el shell Bash, está disponible para todos. Es un lenguaje fácil para empezar a programar. Debido a que se interpreta, no es necesario compilar sus scripts. Tan pronto como haya editado el archivo de secuencia de comandos y lo haya hecho ejecutable, puede ejecutarlo. Esto hace que el ciclo de codificación, ejecución y depuración sea bastante eficiente.

Hay dos quejas principales que la gente tiene con los scripts 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 se puede tocar juntos una escritura rápida y utilizarlo para realizar una tarea mucho más rápidamente que el desarrollo de una solución en un lenguaje compilado como C .

La segunda queja que la gente tiene 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 alguna vez usará el script es su autor, la interfaz probablemente no sea tan importante. Tampoco importa para los scripts que realizan procesamiento en segundo plano y por lotes. Por lo general, estos scripts no necesitan mucha (si acaso) interacción del usuario.

Hay ocasiones en las que necesitas algo un poco más intuitivo y moderno que la ventana del terminal. La mayoría de la gente está familiarizada con una interfaz gráfica de usuario (GUI). Para brindarles a las personas una experiencia lo más fluida posible, debe crear y usar elementos GUI de sus scripts.

La aplicación zenity

zenityle permite incorporar una amplia gama de elementos de interfaz gráfica en sus scripts Bash. Es un poderoso conjunto de herramientas que le da a sus scripts una sensación moderna y una apariencia contemporánea y familiar.

zenityestá preinstalado en las distribuciones de Ubuntu, Fedora y Manjaro. Es parte de GNOME. Si usa KDE, es posible que desee verificar en su   kdialog  lugar, aunque zenity se ejecuta en cualquier entorno de escritorio.

Los ejemplos de este artículo le muestran cómo crear las diferentes ventanas de diálogo desde la línea de comandos, cómo 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 Calendario

Una ventana de diálogo de calendario permite que alguien seleccione una fecha. Para crear uno con se zenityrequiere un solo comando de dos palabras:

zenity --calendario
"zenity --calendar" en una ventana de terminal.

Aparece la ventana de diálogo del calendario. Tiene toda la funcionalidad que esperaría de un selector de fechas 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.

Una ventana de calendario zenity de julio de 2019.

Haga clic en «Aceptar» para cerrar la ventana de diálogo y seleccione 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.

Una ventana de calendario zenity con el 19 de agosto de 2019 seleccionado.

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.

La fecha seleccionada en el calendario (19/08/2019) que se muestra en la ventana del terminal.

Puede ignorar la línea “GTKDialog mapeado sin un padre transitorio. Esto está desanimado «.

GTK son las siglas de GIMP Tool Kit , que es el conjunto de herramientas utilizado para desarrollar la interfaz GNOME . Originalmente fue ideado por los autores del Programa de manipulación de imágenes GNU ( GIMP ). GNU son las siglas de GNU’s Not Unix .

El motor GTK advierte a los autores zenity que han utilizado un componente GTK de forma 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.

Relacionado:  Cómo usar el comando Echo en Linux

Usaremos las siguientes opciones con el calendario. Todos deben usarse con la bandera de dos guiones «-«:

  • –Texto : especifica una cadena de texto para mostrar en el calendario. Reemplaza el valor predeterminado, «Seleccione una fecha de abajo».
  • –Title : establece el título de la ventana de diálogo del calendario.
  • –Día : establece el día que se selecciona cuando se abre el calendario.
  • –Month : establece el mes que se selecciona cuando se abre el calendario.
  • –Year : establece el año que se selecciona cuando se abre el calendario.

Estamos usando una variable llamada ChosenDatepara capturar la fecha devuelta del calendario. Y estamos usando echo $ChosenDatepara imprimir esa fecha en la ventana de la 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 - month 9 --year 2019); echo $ ChosenDate

"ChosenDate = $ (zenity - calendar --text" Elija una fecha "- título" How-To Geek Rota "- día 1 - mes 9 - año 2019); echo $ ChosenDate" en una ventana de terminal.

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.

Calendario zenity con una fecha de inicio seleccionada (1 de septiembre de 2019).

También podemos personalizar el formato de la cadena de fecha devuelta cuando se realiza una selección. La  --date-formatopción debe ir seguida de un especificador de formato. Esta es una cadena de tokens que define los datos y formatos que se incluirán en la salida. Los tokens son los mismos que se usan con la strftime() función de lenguaje C y hay una gran selección de ellos.

Los tokens que estamos usando son:

  • % A : 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 en 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

"ChosenDate = $ (zenity - calendar --text" Elija una fecha "- título" How-To Geek Rota "--date-format ="% A% d /% m /% y "- día 1 - - mes 9 - año 2019); echo $ ChosenDate "en una ventana de terminal.

Alguien elige una fecha:

ventana del calendario zenity con el 16 de septiembre de 2019 seleccionado.

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.

Fecha con formato europeo devuelta por un calendario en una ventana de terminal.

La ventana de diálogo de selección de archivos: elegir un archivo

Las ventanas de diálogo de selección de archivos son bastante complejas. Las personas pueden navegar por el 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.

zenityproporciona 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 utilizar son:

  • –Selección de archivos : indicazenityque queremos usar una ventana de diálogo de selección de archivos.
  • –Múltiple : permite que alguien seleccione más de un archivo.
  • –File-filter : indica a la ventana de diálogo de archivos qué tipos de archivos mostrar.
zenity --file-selection --tile "How-To Geek" --multiple --file-filter = '*. mm * .png * .page * .sh * .txt'

"zenity --file-selection --tile" How-To Geek "--multiple --file-filter = '*. mm * .png * .page * .sh * .txt'" en una ventana de terminal.

La ventana de diálogo de selección de archivos es tan funcional como cualquier otra ventana de selección de archivos.

ventana de diálogo de la sección de archivos de zenity con una carpeta seleccionada.

El usuario puede navegar por el sistema de archivos y seleccionar el archivo de su elección.

ventana de diálogo de selección de archivos de zenity con un archivo seleccionado

Buscamos un nuevo directorio y seleccionamos un archivo llamado «button_hybrid.png».

Al hacer clic en «Aceptar», la ventana de diálogo de selección de archivos se cierra y el nombre del archivo y la ruta se imprimen en la ventana del terminal.

El nombre del archivo seleccionado en una ventana de terminal.

Si necesita 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 archivos: guardar un archivo

Si agregamos una opción, podemos convertir 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 usaremos la  --confirm-overwrite opción. Esto le pide a la persona que confirme que quiere sobrescribir un archivo existente.

Respuesta = $ (zenity --file-selection --save --confirm-overrite); echo $ Respuesta

"Response = $ (zenity --file-selection --save --confirm-overrite); echo $ Response" en una ventana de terminal.

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.

ventana de diálogo para guardar archivo zenity.

El usuario puede buscar la ubicación de su elección dentro del sistema de archivos, proporcionar un nombre para el archivo o hacer clic en un archivo existente para sobrescribirlo.

cuadro de diálogo para guardar archivo zenity con un archivo existente seleccionado.

En el ejemplo anterior, el usuario resaltó un archivo existente.

Cuando hace clic en «Aceptar», aparece una ventana de diálogo de confirmación que le pide 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 zenityuna apariencia profesional.

Relacionado:  Cómo usar el comando tail en Linux

Si no hubiéramos utilizado la --confirm-overwriteopción, el archivo se habría sobrescrito silenciosamente.

diálogo de confirmación de sobrescritura de zenity.

El nombre del archivo se almacena en la variable Response, que se imprime en la ventana del terminal.

Un nombre de archivo guardado en una ventana de terminal.

Ventanas de diálogo de notificación

Con  zenity, incluir ventanas de diálogo de notificación en sus scripts es muy fácil. Hay ventanas de diálogo de valores 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:

  • –Error : indicazenityque queremos usar una ventana de diálogo de error.
  • –Width : establece el ancho inicial de la ventana.

"zenity --error --width 300 --text" Permiso denegado.  No se puede escribir en el archivo. "En una ventana de terminal.

La ventana de diálogo de error aparece con el ancho especificado. Utiliza el icono de error estándar GTK.

ventana de diálogo de error de zenity.

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 nos dice que creemos zenityuna ventana de diálogo de información.

ventana de diálogo de información de zenity.

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 nos dice que creemos zenityuna ventana de diálogo de preguntas.

"zenity --question --width 300 --text" ¿Está contento de continuar? "; echo $?"  en una ventana de terminal.

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 zenityventanas de diálogo. Al verificar este valor en su secuencia de comandos, puede determinar si los datos devueltos desde una ventana de diálogo deben procesarse o ignorarse.

diálogo de pregunta de zenity.

Hicimos clic en «Sí», por lo que el código de retorno es un cero que indica «Aceptar».

Cero (0) código de retorno en una ventana de terminal.

Para crear una ventana de diálogo de advertencia, use el siguiente comando:

zenity --warning --title "Low Hard Drive Space" --width 300 --text "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 nos dice que creemos zenityuna ventana de diálogo de advertencia.

"zenity --warning --title" Low Hard Drive Space "--width 300 --text" Puede que no haya suficiente espacio en el disco duro para guardar la copia de seguridad "en una ventana de terminal.

Aparece la ventana de diálogo de advertencia. No es una pregunta, por lo que solo tiene un botón.

ventana de diálogo de advertencia de zenity.

La ventana de diálogo de progreso

Puede usar la zenityventana de diálogo de progreso para mostrar una barra de progreso que indica qué tan cerca de la finalización de su secuencia de comandos está.

La barra de progreso avanza de acuerdo con los valores que ingresan desde su secuencia de comandos. Para demostrar el principio, use el siguiente comando:

(para i en $ (seq 0 10100); hacer eco $ i; dormir 1; listo)

"(for i in $ (seq 0 10 100); do echo $ i; sleep; done)" en una ventana de terminal.

El comando se descompone así:

  • El seq comando recorre 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 de la terminal.
  • El comando se detiene durante un segundo, debido al sleep 1comando.

Podemos usar esto con la zenityventana de diálogo de progreso para demostrar la barra de progreso. Tenga en cuenta que estamos canalizando la salida del comando anterior azenity:

(para i en $ (seq 0 10 100); echo $ i; dormir 1; hecho) | zenity --progress --title "How-To Geek" - cierre automático

"(para i en $ (seq 0 10 100); hacer echo $ i; dormir 1; listo) | zenity --progress --title" How-To Geek "- auto-close" en una ventana de terminal.

Las nuevas opciones que estamos usando son:

  • –Progreso : indicazenityque 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.

diálogo de progreso de zenity.

Podemos usar ese concepto de canalizar valores zenitypara 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 lista de trabajo () {

echo "# Primer elemento de trabajo" 
echo "25"
dormir 1

echo "# Segundo elemento de trabajo" 
echo "50"
dormir 1

echo "# Tercer elemento de trabajo" 
echo "75"
dormir 1

echo "# Último elemento de trabajo" 
echo "100"
dormir 1

}

lista de trabajo | zenity --progress --title "How-To Geek" --auto-close

salir 0

Aquí hay un desglose del guión:

  • El script define una función llamada work-list. Aquí es donde pones tus comandos e instrucciones para realizar un trabajo real. Reemplace cada uno de los sleep 1comandos con los reales.
  • zenity acepta las echo "# ..."líneas 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 echolíneas que contienen números, como echo "25" , también son aceptadas por zenityy establecen el valor de la barra de progreso.
  • La función de lista de trabajo se llama y se canaliza zenity.

Utilice este comando para hacer que el script sea ejecutable:

chmod + x progress.sh

"chmod + x progress.sh" en una ventana de terminal.

Utilice este comando para ejecutar el script:

./progress.sh

"./progress.sh" en una ventana de terminal.

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.

Relacionado:  Cómo mostrar la fecha y la hora en la terminal de Linux (y usarla en scripts Bash)

ventana de diálogo de la barra de progreso de zenity.

La ventana de diálogo de escala

La ventana de diálogo de escala permite que alguien mueva un control deslizante para elegir un valor numérico. Esto significa que no puede ingresar un valor demasiado alto o demasiado bajo.

Las nuevas opciones que estamos usando son:

  • –Escala : indicazenityque queremos usar una ventana de diálogo de escala.
  • –Min-value : establece el valor mínimo de la escala.
  • –Max-value : establece el valor máximo de la escala.
  • –Paso : establece la cantidad de movimiento del control deslizante cuando se utilizan las teclas de flecha. Esto no afecta los movimientos del control deslizante si alguien usa el mouse.
  • –Valor : establece el valor inicial y la posición del control deslizante.

Este es el comando que estamos usando:

Respuesta = $ (zenity --scale --title "How-To Geek" --text "Select magnification." --Min-value = 0 --max-value = 30 --step = 3 --value15); echo $ Respuesta

"Respuesta = $ (zenity --scale --title" How-To Geek "--text" Seleccionar magnifcación. "--Min-value = 0 --max-value = 30 --step = 3 --value15); echo $ Response "en una ventana de terminal.

Aparece la ventana de diálogo del control deslizante con el control deslizante establecido en 15.

ventana de diálogo de escala de zenity.

El usuario puede mover el control deslizante para seleccionar un nuevo valor.

diálogo de escala zenity con selección de usuario

Cuando hace clic en «Aceptar», el valor se transfiere a la variable Response y se imprime en la ventana de la terminal.

valor de escala de zenity en una ventana de terminal.

La ventana de diálogo de entrada

La ventana de diálogo de entrada permite que alguien introduzca texto.

Las nuevas opciones que estamos usando son:

  • –Entry : indicazenityque 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 --entry --text "Ingrese su término de búsqueda" --title "Howe-To Geek" --entry-text = ""); echo $ Respuesta

"Response = $ (zenity --entry --text" Ingrese su término de búsqueda "--title" Howe-To Geek2 --entry-text = "");  echo $ Response "en una ventana de terminal.

Aparece una ventana de diálogo simple que contiene un campo de entrada de texto.

ventana de diálogo de entrada de zenity.

Alguien puede escribir y editar texto.

ventana de diálogo de entrada de zenity con texto escrito en el campo de 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 del terminal.

Término de entrada de texto de usuario en una ventana de terminal.

Poniendolo todo junto

Juntemos estas técnicas y creemos un guión funcional. 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:

  • La primera 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 que 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

# Mostrar lista de hardware para esta computadora

TempFile = $ (mktemp)

ListType = `zenity --width = 400 --height = 275 --list --radiolist \
     --título 'Escaneo de hardware' \
     --text 'Seleccione el tipo de escaneo:' \
     --columna 'Seleccionar' \
     --columna 'Tipo de escaneo' VERDADERO "Corto" FALSO "Largo" `

si [[$? -eq 1]]; luego

  # presionaron Cancelar o cerraron la ventana de diálogo 
  zenity --error --title = "Escaneo rechazado" --width = 200 \
       --text = "Escaneo de hardware omitido"
  salida 1
 
elif [$ ListType == "Corto"]; luego

  # seleccionaron el botón de radio corto 
  Bandera = "- corto"
 
más

  # seleccionaron el botón de radio largo 
  Bandera = "" 
fi

# busque información de hardware con el valor apropiado en $ Flag
hwinfo $ Bandera | tee> (zenity --width = 200 --height = 100 \
     --title = "Recopilación de información" --progress \
     --pulsate --text = "Comprobando hardware ..." \
     --auto-kill --auto-close)> $ {TempFile}
 
# Mostrar la información del hardware en una ventana de desplazamiento
zenity --ancho = 800 --altura = 600 \
     --título "Detalles del hardware" \
     --text-info --filename = "$ {TempFile}"
 
salir 0

Utilice este comando para hacerlo ejecutable:

chmod + x hardware-info.sh

"chmod + x haredware-info.sh en una" ventana de terminal.

Esta secuencia de comandos crea un archivo temporal y el nombre del archivo se guarda en la variable TempFile:

TempFile = $ (mktemp)

El script usa la --listopción para crear una zenityventana de diálogo 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 envuelta alrededor. Este es el proceso: