P1N6Ü1N0 - SHELL - DIALOG



Inicio
C
Perl
Caml
Shell
GTK
SQL

En esta sección vamos a ver como hacer scripts con interfaz de usuario, la última moda en scripts, para que parezcan verdaderas aplicaciones.

En primer lugar aseguraos de que teneis el paquete dialog instalado en vuestro sistema. En él viene el ejecutable del mismo nombre que permite hacer las interfaces.

Dialog, como cualquier sistema de interfaces con el usuario, nos permite hacer dos cosas, por un lado, presentar al usuario la información que deseamos, y por otra parte, pedir información al usuario.

Además, tiene los widgets típicos de cualquier sistema de interfaces: diálogos, botones, cajas de texto, menús, checkbuttons, radiobuttons, barras de progreso, etc.

Todos los widgets de dialog van siempre asociados a un dialogo.

La forma de manejar dialog es mediante el comando:

dialog op_genericas op_dialogo { --and-widget op_genericas op_dialogo }

En op_genericas se ponen opciones comunes a todos los widgets (ver ayuda de dialog).

En op_dialogo se ponen las opciones de un diálogo concreto. Cada diálogo tiene un número de opciones definido, voy a explicar a continuación lo que hace cada diálogo y lo que significan sus opciones. En principio, todos los dialogos van seguidos de las opciones: <text> <height> <width> La primera es el título de la ventana, la segunda es el ancho y la tercera el alto. Si los igualamos a cero, se elegirán el ancho y alto mínimos necesarios. Hay que tener cuidado con esto en el --guage, porque el diálogo de la barra de progreso se adapta al tamaño que le pongamos y con cero suele salir un diálogo bastante feo. A partir de ahora voy a comentar solo las opciones que tiene cada diálogo a mayores de estas.

  • --yesno <text> <height> <width>: Crea un diálogo para preguntar algo a lo que se puede responder si ono.
  • --msgbox <text> <height> <width>: Crea un diálogo para informár de alguna circustancia, y espera a que el usuario pinche el botón.
  • --infobox <text> <height> <width>: Igual, pero no tiene botón, muestra la información y no espera.
  • --inputbox <text> <height> <width> [<init>]: Es un diálogo para pedir una cadena de texto al usuario. en init ponemos el texto que aparece al principio en el cuadro de texto, o no ponemos nada para que salga vacío.
  • --textbox <file> <height> <width>: Muestra el contenido de un fichero en la pantalla. Observese que en este caso el primer parametro ya no es un texto para el título, sino el fichero a mostrar.
  • --menu <text> <height> <width> <menu height> <tag1> <item1>... : Presenta en pantalla un menú con <menu height> opciones, cada una de ellas definida como <item> <tag>. Item es el nombre del elemento del menu. Tag es un nombre corto. algo más largo.
  • --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...
  • --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...
    Presentan listas de posibles opciones. En el primer caso se pueden marcar más de una. En el segundo caso son exclusivas, sólo una puede estar marcada, de modo que al activarse una se desactivan las demás. <list height> es el número de elementos, <item> y <tag> funcionan como antes, y <status> es el estado inicial de activa/inactiva.
  • --guage <text> <height> <width> <percent>: Muestra una barra de estado en el porcentaje indicado. Los sucesivos valores de porcentajes los va leyendo de la entrada estandar.
  • --tailbox <file> <height> <width> : muestra las últimas líneas de un fichero en una ventana (las que quepan en la ventana). Espera a que se pulse el botón para terminar.
  • --tailboxbg <file> <height> <width>: Igual, pero no espera, no tiene botón.

    Siempre que un diálogo tiene botones de Aceptar/Cancelar o Si/No, devuelven un true al sistema en caso positivo y false en caso contrario, por lo que podemos controlar esto desde un IF.

    Además, cuando deben devolver otro valor, como en el caso de los menús, lo hacen en el error estandar, asi que debemos redireccionar el error estandar a un fichero y luego leerlo.


    EJEMPLO

    A continuación voy a poner y comentar un pequeño ejemplo. Es una especie de file-manager muy sencillo hecho con programación shell y dialog:

    #!/bin/sh
    
    TMPFILE=/tmp/_0F1L3M6R0_
    
    while true;do
     ficheritos=`ls -l|grep -v tot|tail -n 15|sed "s/\([^\ ]*\)\ .*\ \(.*\)/\2 \1/"`
     if dialog --menu "`pwd`" 24 70 16 .. "" $ficheritos 2>$TMPFILE
        then :
        else if dialog --yesno "Estás seguro de que quieres salir?" 0 0
               then rm $TMPFILE;exit
             fi
     fi
     if [ -d `cat $TMPFILE` ]
        then cd `cat $TMPFILE`
        else dialog --msgbox "`cat $TMPFILE` no es un directorio" 0 0
     fi
    done
    

    El script empieza declarando el fichero temporal donde vamos a almacenar los valores que devuelve dialog por el error estandar.

    A continuación empezamos un bucle infinito. Dentro de este, nada más empezar calculamos los valores de un dialog menu mediante el procesado de un ls -l usaremos los nombres de fichero como elementos del menu y sus permisos como descripción. Limitamos el ls a los 15 últimos ficheros, debo tener una versión algo antigua de dialog, porque no me permite más...

    Luego llamamos a dialog con los parámetros necesarios, y capturamos tanto lo que manda por el error estandar como lo que devuelve al sistema. Lo que devuelve al sistema indica que botón se pulsó, si se pulsó aceptar, no hacemos nada (: es no hacer nada), pero si se pulsó cancelar, entonces preguntamos con una ventana tipo yesno si está seguro y si lo está, salimos del script (no sin antes borrar el fichero temporal).

    Una vez que sabemos que se pulsó el botón de aceptar, lo siguiente que hacemos es comprobar si el fichero elegido es un directorio, si lo es, accedemos a él, si no, mostramos un msgbox de error. En cualquiera de los dos casos, el bucle continúa.

  Los gráficos de esta página han sido creados con GIMP.