por Katja y Guido Socher <katja(at)linuxfocusorg, guido(at)linuxfocus.org>
Sobre el autor:
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.
Taducido al español por:
Gabriela Gonzalez <tradugag(at)yahoo.com>
Contenidos:
|
(X)dialog: shells que hablan
Resumen:
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).
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:
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.
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]](../../common/images/article267/xdialog_1.gif)
![[pppdialout with
xdialog]](../../common/images/article267/xdialog_2.gif)
... y en la terminal el cuadro de diálogo se verá
así:
![[pppdialout with
dialog]](../../common/images/article267/dialog_1.gif)
![[pppdialout with
dialog]](../../common/images/article267/dialog_2.gif)
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
Formulario de "talkback" para este artículo
Cada artículo tiene su propia página de "talkback". A través de esa página puedes enviar un comentario o consultar los comentarios de otros lectores
2002-11-12, generated by lfparser version 2.21