miércoles, 7 de marzo de 2018

Scripting con Zenity... para newbies (y IV)

Me estoy alargando más de lo previsto (más bien enrollando, esto es excesivamente complejo para mis conocimientos de Programación, y me temo que estoy escribiendo, a ‘vuelapluma’, un tocho infumable). El caso es que no quiero hacer unas ‘entradas’ de Blog excesivamente largas, y me quedan muchas cosas más en el tintero. Me parece que voy a terminar con algún ejemplo de uso de la herramienta Zenity para hacer scripts con otras sencillas ventanas más. Se me ocurren estas otras dos: el ‘diálogo de selección de archivos’ que se entiende fácilmente lo que propicia, y el ‘diálogo de información’, que sirve para presentarnos, gráficamente, la finalización de una acción.
Vamos allá...

Dialogo D-ventana para la selección (y ejecución) de archivos
Su sintaxis es muy simple, escribiendo, por ejemplo en consola
zenity --file-selection --title="Selecciona un archivo"
se nos abrirá una ventana con la estructura de directorios de nuestra /home, donde podremos navegar por los mismos y seleccionar el archivo que quieras.
Pero no podrás hacer nada con él, salvo (con botón derecho ratón)… copiar ubicación, y podrías pegar su ruta completa donde quieras o clicando en él, escribirlo en la consola.
Y es que si quieres hacer algo con un archivo seleccionado (normalmente ‘abrirlo’) necesitas asignar esa instrucción a la variable que obtengas seleccionando un archivo.
Así que a ese sintaxis indicada hay añadir una pequeña secuencia de instrucciones, usando el comando ‘case’ que el propio manual de este diálogo te proporciona, y que, sin entrar en más historias, se puede aprovechar. 
Solo que, para que se ejecute el archivo, hay que añadir una última línea, que no sería más que el comando para abrir el archivo seleccionado.
He descubierto un interesantísimo comando, que se llama xdg-open que ejecuta cualquier archivo cuya extensión esté asociada a una aplicación instalada… con lo cual la orden
xdg-open “$FILE”
abrirá casi todos los archivos (lo pongo entre comillas para prever archivos cuyo nombre contenga varias palabras separadas). Hombre, si lo que quiero es ejecutar un script, no me vale (esa orden solo lo editaría, porque es un archivo de texto), lo que habría que poner el clásico sh FILE (o, a mi, curiosamente, me va mejor, bash $FILE).
Asi que un script para abrir casi todos los archivos (y que podría tener interés el creamos un lanzador, en el Escritorio, de nombre ‘Buscar y abrir archivos’), usando Zenity, podría ser este...:
#!/bin/bash
FILE=`zenity --file-selection --title="Select a File"`
case $? in
0)
echo "\"$FILE\" seleccionado.";;
1)
echo "No ha seleccionado ningún archivo.";;
-1)
echo "Ha ocurrido un error inesperado.";;
esac
xdg-open "$FILE"
NOTA: ya lo comenté en su día, $? es una variable especial que invoca al ‘valor devuelto por el último comando ejecutado’, Cuando el script funciona sin problemas devuelve el valor 0; cuando falla devuelve un número distinto de cero, normalmente 1 si falta por realizarse alguna acción y -1 se ha ocurrido algún fallo.
Por cierto, este script es ‘de un solo uso’ porque, al abrir el archivo elegido se cierra la consola, y si quiero buscar otro archivo tendría que volver a ejecutar el script (o el lanzador)
Pero el amigo ‘neurus’, que tanto me ha ayudado estos días, me proporcionó otro diseño, que te devuelve a la consola, y que, con un simple ‘flecha UP’ puedo retomar el último comando, que será precisamente, el del script, y es una forma mucho más cómoda de poderlo volver a ejecutar para buscar y abrir otro archivo.
El diseño es similar, pero usando el concepto de ‘función’ y la invocación, como variable, de los ‘argumentos’ o ‘parámetros’ de todo script
#!/bin/bash
function abrir (){
xdg-open $1
}
FILE=`zenity --file-selection --title="Select a File"`
case $? in
0) abrir $FILE && $0
;;
1)
echo "No ha seleccionado ningún archivo.";;
-1)
echo "Ha ocurrido un error inesperado.";;
esac
NOTA: $1 invocaría el primer argumento (la ‘salida estandar’), etc.. Ah, y, por recordarlo también && significa ‘ejecuta el siguiente comando cuando se haya terminado exitosamente el primero’
Así que aquí quedan las dos opciones del ejemplo de script para buscar y abrir (ejecutar) un archivo.

Dialogo E-ventana de información
Su sintaxis es muy simple, escribiendo en consola
zenity --info –text="texto a incluir’"
nos aparece una ventana de información. Al ‘Aceptar’, se cierra la consola. Puede ser un complemento interesante.
Por ejemplo, basándome en la ventana anterior, y en esta, he aquí un sencillo script para convertir cualquier video a AVI, a través de ffmpeg, manteniendo la calidad (igual bitrate de video) y poniendo el audio en lame MP3, y que he llamado convertAVI.sh
#!/bin/bash
FILE=`zenity --file-selection --title="Selecciona un archivo"`
ffmpeg -i “$FILE” -vcodec mpeg4 -q:v 0 -acodec libmp3lame output.avi
zenity --info \
--text="Terminó conversión de video"
Bueno, y etcétera, hay varios diálogos zenity más, repito lo de poder verlo aquí, (y en múltiples páginas web, buscando con Google). Unos son particulares, otros más genéricos (me defraudó la ventana de progreso, no supe ponerla para, por ejemplo, este último script de convertir un video), pero...

FINAL
Bien, pues hasta aquí hemos llegado. Debo decir que tengo una especie de frustración porque esto del scripting en muy divertido, y tal, pero sospecho que avanzaré muy poco porque…
1- no tengo formación suficiente en Programación (ni tiempo para adquirirla)
2- el uso de comandos (aparte de los muy comunes) está restringido a los profesionales que los usan a diario. A un 'newbie' se le olvidan, y tiene que empezar a pensar, y consultar en sus apuntes, cosas tan tontas como cual connio es la sintaxis del comando if-then. Vamos, como lo de usar el Photoshop (perdón, el Gimp), que solo le pueden sacar partido los que practican todos con días con él.
3- hace mucho que me di cuenta de que que soy todo lo contrario a un hombre tranquilo, por ‘acelerarme’ cometo cantidad de errores tontos en la sintaxis de los comandos, cuando no errores de escritura, últimamente descubro que soy ‘teclado-dislepsico’. Y esto, para hacer ‘programitas’, es muy malo: estos pequeños errores hacen que no funcione ninguno.
4- entiendo que si algo se necesita en ‘programación’ es tener ideas claras y bien ordenadas, buena memoria, mente lógica, y muy estructurada… y un espíritu calmado y tranquilo (en algún caso, yo diría que ser algo 'cabezacuadrada')
Y yo soy justo lo contrario: intuitivo e imaginativo, soy incapaz de leerme una novela de misterio: me voy directamente al final del libro. O sea que NO DOY EL PERFIL.
Total, que lo he pasado muy bien, me ha servido para pasar una semana muy entretenido, y poder poner muchas 'chorradas' (quizás demasiadas...) en mi Blog, pero es hora de echar el freno a zenity y el scripting. 
Aquí quedan… y yo quedo con el placer de conocer cosas nuevas, y con sus fundamentos, por si algún día los puedo utilizar.

No hay comentarios:

Publicar un comentario