(X)dialog: Talking shells

ArticleCategory: [Choose a category, translators: do not translate this, see list below for available categories]

UNIXBasics

AuthorImage:[Here we need a little image from you]

[Photo of the Authors]

TranslationInfo:

original in en Katja y Guido Socher 

en to es Gabriela Gonzalez 

AboutTheAuthor:

Katja es la editora en alemán de LinuxFocus. A ella le gustan Tux, el cine, la fotografía y el mar. Puedes encontrar su página aquí.

Guido ha sido un admirador de Linux desde hace tiempo. Le gusta Linux porque está diseñado por gente honesta y abierta. Esta es una de las razones por las cuales lo llamamos fuente abierta. Su página está en linuxfocus.org/~guido.

Abstract:

Xdialog y dialog son dos utilidades clásicas que permiten mejorar tus scripts de shell con una interfaz de usuario gráfica.
Necesitarás saber un poco sobre programación de shell para comprender este este artículo. Para aprender lo básico sobre programación de shell puedes ver nuestro artículo en Programas Shell (Shell Programming).

ArticleIllustration:

[Illustration]

ArticleBody:

Presentación

UNIX shell es un entorno muy productivo en sí mismo y funciona bien sin una interfaz de usuario gráfica.
En algunos pocos casos, sin embargo, conviene contar con un diálogo gráfico con el usuario. Un ejemplo de esto es el diálogo de instalación de un programa. Tienes un número de opciones de características que se pueden instalar y puedes elegir el directorio de destino ....

Ingresar (X)dialog...

con dialog y Xdialog puedes diseñar una aplicación gráfica con sólo escribir un breve shell script. Dialog es un programa basado puramente en terminal Xdialog es un programa X11.
Aquí encontrarás un ejemplo:
Puedes escribir (o bien copiar/pegar) lo siguiente en un shell (xterm, konsole,....):

bash
Xdialog --yesno "Do you want to learn more about Xdialog?" 0 0;\
case $? in
0)
echo "Result: Yes chosen.";;
1)
echo "Result: No chosen.";;
255)
echo "ESC pressed.";;
esac

El cuadro que aparecerá mostrará algo como esto:

[yes/no Xdialog]

Si utilizas dialog en lugar de Xdialog (borra la X en la segunda línea en el script que se mostró anteriormente) entonces obtendrás una aplicación que se basa en expresiones extrañas que se ejecuta sin el xterm y no abre una ventana separada. En algunos casos esto es más apropiado para un shell script ya que se ejecuta simplemente sin la ventana terminal. Esto es importante si quieres ejecutarlo en forma remota con diferentes hosts entre tu ordenador y el host remoto donde el IP routing no se encuentra disponible. En este caso dialog funcionará pero no podrás iniciar una aplicación X11 del tipo de Xdialog.

[yes/no dialog]

Lo que antecede es una aplicación de dialog/Xdialog que no tendrá realmente uso pero que muestra que fácil es programar un diálogo gráfico sencillo. Hay más cuadros de diálogo interesantes tales como calendario, menúes, administrador de archivos, barra progess, cuadro de texto, casilla de mensajes, cuadro de diálogo de contraseña, ... Si ejecutas:

dialog --help
o
Xdialog --help

verás un listado de los cuadros de diálogo disponibles. Xdialog ofrece algunos cuadros de diálogo más que dialog.

Cómo funciona

Los cuadros de diálogo se configuran en la línea de comandos.

dialog --yesno "text string" <height> <width>

Después de escribir dialog o Xdialog debes indicar el nombre del cuadro de diálogo que deseas, seguido de sus parámetros específicos.

El cuadro de diálogo yesno implica 3 parámetros. La altura <height> y el ancho <width> pueden establecerse en cero en cuyo caso la geometría del cuadro será ajustada automáticamente al tamaño del texto. El resultado se mostrará como estado de salida en la pantalla en la variable "$?". Si hay algo más que deba mostrarse como, por ejemplo, los nombres de las opciones seleccionadas, esto aparecerá como un error tipo (o standard). El error tipo (o standard) generalmente se muestra en la pantalla pero puede ser redireccionado con ">2".

Una solución muy simple pero eficaz.

Verdaderas aplicaciones

Una verdadera aplicación mundial en donde Xdialog/dialog realmente presenta una ventaja sobre los programas de tipo shell scripts convencionales: Un menú en el que puedes seleccionar distintos proveedores de Internet y conectarte a ella. Este script requiere de los ppp-on/ppp-off scripts que se encuentran en la edición de marzo 2001, en el artículo Using different ISPs for your Internet access. El script se llama pppdialout y despliega un menú diferente según te encuentres conectado a Internet o no.
#!/bin/sh
#
#DIALOG=Xdialog
DIALOG=dialog
#
# name of your default isp:
defaultisp=maxnet
#
error()
{
    echo "$1"
    exit 2
}
help()
{
  cat <<HELP
pppdialout -- select an ISP and dial out.
All available ISPs must have a config file in 
/etc/ppp/peers

pppdialout executes the ppp-on/ppp-off scripts as described
in 

pppdialout, copyright gpl, 

HELP
  exit 0
}

# parse command line:
while [ -n "$1" ]; do
case $1 in
    -h) help;shift 1;; # function help is called
    --) shift;break;; # end of options
    -*) echo "error: no such option $1. -h for help";exit 
1;;
    *)  break;;
esac
done

tempfile=/tmp/pppdialout.$$
trap "rm -f $tempfile" 1 2 5 15

# check if we have a ppp network interface
if /sbin/ifconfig | grep '^ppp' > /dev/null; then
    # we are already online
    $DIALOG --title "go offline" --yesno "Click YES to \
                     terminate the ppp connection" 0 0
    rval="$?"
    clear 
    if [ "$rval" = "0" ]; then
        echo "running /etc/ppp/scripts/ppp-off ..."
        /etc/ppp/scripts/ppp-off
    fi
else
    # no ppp connection found, go online
    # get the names of all available ISP by listing 
/etc/ppp/peers
    for f in `ls /etc/ppp/peers`; do
        if [ -f "/etc/ppp/peers/$f" ]; then
            isplist="$isplist $f =="
        fi
    done
    [ -z "$isplist" ]&&error "No isp def found in 
/etc/ppp/peers"
    #
    $DIALOG --default-item "$defaultisp" --title 
"pppdialout"  \
         --menu "Please select one of\
    the following ISPs for dialout" 0 0 0 $isplist 2> 
$tempfile
    rval="$?" # return status, isp name will be in 
$tempfile
    clear
    if [ "$rval" = "0" ]; then
        isp=`cat $tempfile`
        echo "running /etc/ppp/scripts/ppp-on $isp..."  
        /etc/ppp/scripts/ppp-on "$isp"
    else
        echo "Cancel..."    
    fi
    rm -f $tempfile
fi
# end of pppdialout
Cómo funciona el script:
Al comienzo definimos algunas funciones, error y ayuda, luego chequeamos argumentos de la línea de comandos y se define un nombre para el archivo temporario (/tmp/pppdialout.$$). $$ es el nombre del proceso actual y tiene un número único para cada ordenador. La indicación de trap (trampa) se ejecuta cuando el programa no ha sido cerrado correctamente (como cuando el usuario pulsa crtl-C) y en nuestro caso, borra el archivo temporario. Después de eso chequeamos si aún estamos conectados o no (command: /sbin/ifconfig | grep '^ppp'). Si estamos conectamos entonces abriremos un cuadro de diálogo yesno, el mismo que ya has visto más arriba, que pregunta al usuario si desea desconectarse. Si no estamos conectados se abrirá un cuadro de diálogo. Podemos ver todos los ISPs disponibles observando el listado de archivos en /etc/ppp/peers (ls /etc/ppp/peers). La sintáxis del menú de diálogo es:

dialog --menu "text" <height> <width> <menu height> <tag1> <description> ...

La altura <height>, <width> ancho y altura del menú <menu height> son nuevamente establecidos en cero (tamaño automático, ver arriba) y luego el programa espera pares de claves (<tag1> <description>). Realmente no contamos con una descripción, así que indicaremos algo sin sentido (== en este caso). Los datos listados se verán de este modo:

isp1 == isp2 == isp3 ==

En (X)dialog el resultado de la elección del usuario aparecerá como error tipo (o standard). El comando shell "2> $tmpfile" lo escribe en nuestro archivo temporario. El cuadro del menú también ofrece la posibilidad de presionar cancelar (cancel). Por lo tanto debemos chequear $? (estado de salida -o exit status) para descubrir cúal es el botón que ha sido pulsado.

Bien, suficiente teoría. Así es como se verá

... como GTK GUI con Xdialog:

[pppdialout with 
xdialog]
[pppdialout with 
xdialog]

... y en la terminal el cuadro de diálogo se verá así:

[pppdialout with 
dialog]
[pppdialout with 
dialog]

Más aplicaciones

Tenemos una aplicación más para tí. Se llama mktgz y utiliza la lista de verificación de Xdialog. El diálogo basado en la terminal convencional no presenta una lista de verificación, por lo tanto funciona unicamente con Xdialog. Puedes utilizar mktgz para construir paquetes tar.gz.

mktgz yourpackage .

Esto desplegará todos los archivos del directorio abierto (".") y podrás seleccionar cúales incluir en el paquete yourpackage.tar.gz. Puedes descargarlo aquí (mktgz.txt) Dado que ya conoces lo suficiente para leer el script, no veremos línea por línea.

Xdialog y dialog contienen un directorio llamado "samples" ("muestras") en donde puedes encontrar más ejemplos (Redhat 7.3 los guarda bajo /usr/share/doc/Xdialog-2.0.5/samples). Sin embargo, hay que tener cuidado, ya que algunos de ellos cumplen funciones y no son sólo aplicaciones de demostración.

Conclusión

Xdialog y dialog ofrecen distintos cuadros de diálogo. No todos ellos resultan siempre apropiados para todos los tipos de shell scripts. El shell en sí mismo es un entorno muy "poderoso" Completar una ruta con la tecla del tabulador (TAB) puede ser mucho más rápido que buscar los diferentes directorios en un GUI y hacer click en ellos. La posibilidad de canalizar y combinar comandos es lo que lo convierte en una herramienta particularmente poderosa. Algo como:
grep -i "somestring" file.txt | sort | uniq | wc -l
(Para aquéllos que no tengan mucha experiencia con shells UNIX: esto considera a todas las líneas que se distinguen con la terminación file.txt que contienen la cadena "somestring")
Tales construcciones de canalización son posibles porque todos los comandos son controlados por argumentos de línea de comandos. En otras palabras: no se detienen para consultarle al usuario cómo desea continuar.
Hay aplicaciones, sin embargo, en donde los diálogos gráficos son muy útiles. Xdialog y dialog son muy fáciles de usar pero no son tan poderosos como una aplicación gráfica real. Llenan el especio entre un shell script ASCII puro y una aplicación gráfica completa.

¿Dónde se consiguen Xdialog y dialog?

Los CDs de tu distribuidora Linux son el primer recurso con el que cuentas para hallar dialog y Xdialog. Podrían ya estar instalados en tu ordenador (indica a tu ordenador lo siguiente: e.g. rpm -qil Xdialog, dpkg -L Xdialog). La página de Xdialog es:

y dialog se encuentra en

También puedes descargar dialog/Xdialog desde aquí.

Referencias