lunes, 6 de octubre de 2008

Progresa Adecuadamente

Lo que os voy a contar en este post es una chorrada sobre programación en shell (consola de Linux) que he necesitado hacer ya un par de veces y que no explican en demasiados sitios.

Zenity es una forma de utilizar la interfaz gráfica de GNOME en tus scripts de manera sencilla.

Tiene varios tipos de ventanas (calendarios, ventanas de información, de advertencia, selectores de ficheros/directorios, etc.). La del ejemplo de arriba es una lista (zenity --list), lo que aparece debajo de la ventana es el código para crearla (asociando su respuesta a la variable "Op").

Estas ventanas son fáciles de usar, hay un montón de información sobre esto en la red, y dan un aspecto elegante a nuestros scripts sin demasiado trabajo.

El problema viene con la barra de progreso (zenity --progress). En muchos sitios veréis que se propone como sintaxis la siguiente:

(
Órdenes
echo "p1"
echo "#Horneando pasteles."
...
echo "p2"
echo "#Fregando los cacharros."
)|zenity --progress


Donde p1 y p2 son porcentajes (números del 0 al 100) y lo que va seguido del símbolo "#" son las tareas.

El problema que casi nadie comenta es que si haces asignaciones de variables dentro del paréntesis, cosa muy común, esos valores no salen fuera del paréntesis. Por ejemplo:

Órdenes
echo "p1"
echo "#Horneando pasteles."
...
n=1
...

echo "p2"
echo "#Fregando los cacharros."


echo $n


Entonces el "echo" devuelve 1, sin embargo, si queremos hacerlo con el zenity:

(
Órdenes

echo "p1"
echo "#Horneando pasteles."
...
n=1
...

echo "p2"
echo "#Fregando los cacharros."
)|zenity --progress

echo $n


La variable n consta como indefinida, no sale del paréntesis.

Cuál es la solución? Redireccionar la salida! El problema es que en el ejemplo anterior mandamos toda la información a la barra de progreso de zenity, incluyendo los valores de las variables que hay dentro, pero el zenity sólo necesita porcentajes y tareas, así que redireccionemos sólo eso a la barra de progreso:

exec 3> >(zenity --progress) # Redireccionamos la salida "3" a la barra de progreso.
Órdenes

echo "p1" >&3 # Sólo mandamos a la barra los porcentajes
echo "#Horneando pasteles." >&3 # y las tareas.
...
n=1
...

echo "p2" >&3 # Porcentaje.

echo "#Fregando los cacharros." >&3 # Tarea.
exec 3 >&- # Cerramos el canal "3".

echo $n


De esta manera, el "echo" devuelve el valor 1, y a la vez podemos ver una barra de progreso sincronizada con las tareas que se van realizando (lo que va después del símbolo "#" al final de las líneas no cuenta para el código, son comentarios, a diferencia de los que van dentro del "echo", que son tareas para la barra de progreso).


Espero que os sea útil, porque yo no encontraba casi nada sobre el tema. Aquí tenéis uno de los enlaces en los que me he basado por si queréis saber más.

No hay comentarios:

Publicar un comentario

Querido astarothista!,

Si te ha gustado la entrada y quieres dejar constancia de ello, tienes alguna sugerencia para completarla o corregirla, quieres mostrar tu opinión respecto a algo de lo que se haya hablado en esta entrada (con respeto) o simplemente quieres dejarme un mensaje a mi o a la comunidad, no dudes en comentar ;)!

Recuerda que también estamos en Facebook y en Google+.