una pregunta sobre zenity

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1807
Registrado: Dom Oct 10, 2004 7:00 am

Re: una pregunta sobre zenity

Mensaje por neurus » Lun Mar 05, 2018 8:42 pm

Supongo que lo que estás buscando es esto:

Código: Seleccionar todo

#!/bin/bash
function abrir (){
	xdg-open "$FILE"
}
FILE=`zenity --file-selection --title="Select a File"`

case $? in
	0) abrir && $0
	;;
	1)
		echo "No ha seleccionado ningún archivo.";;
	-1)
		echo "Ha ocurrido un error inesperado.";;
esac

Sobre tu código:
1) if se cierra con fi, no con done.
2) hay un error de algoritmia, más que de código. Si lo que quieres es que se vuelva a ejecutar el script luego de ejecutar exitosamente la acción, entonces forma parte de la primera condición del case, como lo escribí arriba.
Incluso si el if estuviera bien escrito, lo que estás haciendo allí es ejecutarlo siempre, independientemente del éxito de la acción, porque está fuera de la estructura case. El sistema lee: variable<-ejecución; case-esac; if-fi. Va a analizar siempre el if, aunque le des cancelar. Dentro del case, en cambio, sólo lo ejecuta en caso de que efectivamente se haya abierto un archivo.


##################################################

Ahora, refinando un poco el tema de las funciones: se supone que una función debe ser reutilizable. Si escribes una función para abrir archivos, y sólo puede abrir el archivo guardado en la variable $FILE, entonces su utilidad es bastante acotada.
Esta es una característica pensada sobre todo para grandes proyectos. A lo mejor se le da a un equipo de programadores la tarea de escribir una función que "haga algo", y a otro equipo la tarea de enviarle "algo" a esa función. Podrían ponerse todos de acuerdo sobre los nombres de las variables a usar, pero aún así estaríamos ante una limitación innecesaria.

¿Solución? Que la función abra aquello que se le pasa como parámetro. Así como los scripts aceptan parámetros, los aceptan las funciones. Y la nomenclatura es idéntica: $0 es la propia función, $1 el primer argumento, etc. La función en este caso debería ejecutar xdg-open $1. ¿Y cómo le dices qué archivo tiene que abrir? Invocándola así: abrir $FILE.
Ese es el sentido de que la función se escriba así: function nombre (). Esos paréntesis son el lugar de paso de los parámetros.


Código: Seleccionar todo

#!/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

Avatar de Usuario
doc
Forista Ancestral
Forista Ancestral
Mensajes: 3304
Registrado: Mié Ago 11, 2010 10:32 am
Ubicación: Oviedo-es_ES
Contactar:

Re: una pregunta sobre zenity

Mensaje por doc » Lun Mar 05, 2018 9:41 pm

perfecto... porque aunque no hace, al final, lo que yo pretendía (que al cerrar el archivo abierto se auto-iniciase de nuevo el script y me saliese, directamente, la ventana para elegir otro archivo)... veo que me vale con la consola y el prompt, y es muy sencillo pulsar 'flecha Up' para que se repita el comando anterior... que es el de ejecutar el script.
Muchísimas gracias, Diego.

Y ¿sabes? lo he pasado (y aún sigo pasándolo, para rematar algunas cosas) muy bien, estos últimos días, con lo del scripting y zenity, aprendiendo cosas nuevas... por e placer de conocerlas porque, verdaderamente, que nunca (o apenas) usaré, y ello por estas principales razones
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 lo usen todos los días, si no se te olvida.
3- hace mucho que me di cuenta de que que soy todo lo contrario a un hombre tranquilo, fíjate la cantidad de errores tontos que cometo, que si cambio while por if, pero se me olvida sustituir done por fi, etc, etc.. Incluso soy algo 'dislepsico'. Y esto, para querer hacer 'programitas'... es muy malo.
4- y, hace mucho más, descubrí que hasat yo mismo era malo (aunque esto es bueno: 'si te conoces, y conoces a tu enemigo...' :D :D

Total, que lo he pasado muy bien, me ha servido para poner muchas 'chorradas' (demasiadas...) en mi Blog, y voy a echar el freno a zenity y el scripting. Me es suficiente, ya puedo hablar 5 minutos sobre el tema. :wink:

(y ahora, voy a leer con calma, para entender mejor, tu última 'lección magistral') :drinks:
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1807
Registrado: Dom Oct 10, 2004 7:00 am

Re: una pregunta sobre zenity

Mensaje por neurus » Lun Mar 05, 2018 9:43 pm

¿Cómo que no hace eso? Precisamente eso fue lo que probé. Si abres un archivo, al cerrarlo vuelve a abrirse el menú de selección.
Avatar de Usuario
doc
Forista Ancestral
Forista Ancestral
Mensajes: 3304
Registrado: Mié Ago 11, 2010 10:32 am
Ubicación: Oviedo-es_ES
Contactar:

Re: una pregunta sobre zenity

Mensaje por doc » Lun Mar 05, 2018 9:55 pm

neurus escribió:¿Cómo que no hace eso? Precisamente eso fue lo que probé. Si abres un archivo, al cerrarlo vuelve a abrirse el menú de selección.
pues a mi no, y lo he probado varias veces, con PDFs, con *.doc... (ya me pasó en otro día, con otro script que me mandaste) y fíjate que lo único que he hecho ha sido un copy&paste a gedit, y guardarlo como 'pruebasel2.sh')
Investigaré esta noche, que ahora voy a salir a tomar un copazo al bar de abajo (mi 'taberna de Moe') :D
Avatar de Usuario
doc
Forista Ancestral
Forista Ancestral
Mensajes: 3304
Registrado: Mié Ago 11, 2010 10:32 am
Ubicación: Oviedo-es_ES
Contactar:

Re: una pregunta sobre zenity

Mensaje por doc » Mar Mar 06, 2018 1:32 am

neurus, una pregunta tonta que se me ha venido a la mente, y (maldita sea...) no me la puedo quitar de encima:
si tengo una orden, por consola, como esta (o similar, que sirve para transcodificar un archivo de video, a AVI)...

Código: Seleccionar todo

ffmpeg -i nombre_archivo -vcodec mpeg4 -q:v 0 -acodec libmp3lame output.avi
¿es factible poder sustituir en ella, 'nombre_archivo' por el nombre, concreto de un archivo (o sea, el famoso $FILE ¿no?)
lo digo porque el nombre no está al final, sino que hay que intercalarlo en el comando ¿quizás con 'sed'?
¿es fácil o más bien complejo?
(en el fondo la pregunta es... ya que me conoces... ¿está a mi alcance hacerlo?)
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1807
Registrado: Dom Oct 10, 2004 7:00 am

Re: una pregunta sobre zenity

Mensaje por neurus » Mar Mar 06, 2018 12:13 pm

Hay poquísimos lugares donde se vuelve complicado usar una variable externa. Concretamente, todas aquellas cadenas que estén relacionadas con búsquedas de expresiones regulares. Es un tanto difícil traer una variable a awk o a sed, por ejemplo (por "difícil", hablo de un nivel un poco más avanzado, tampoco es tecnología alienígena).

Por lo demás, en comandos "normalitos", no importa en qué lugar de la expresión quieras usarla, siempre puede reemplazarse una cadena por una variable.

De hecho, podrías probarlo incluso sin script.
En una consola haces VAR="archivo"
A la siguiente línea, ffmpeg -i $VAR...
Tiene que funcionar.
Avatar de Usuario
doc
Forista Ancestral
Forista Ancestral
Mensajes: 3304
Registrado: Mié Ago 11, 2010 10:32 am
Ubicación: Oviedo-es_ES
Contactar:

Re: una pregunta sobre zenity

Mensaje por doc » Mar Mar 06, 2018 4:49 pm

OK, aclarado, gracias
Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1807
Registrado: Dom Oct 10, 2004 7:00 am

Re: una pregunta sobre zenity

Mensaje por neurus » Mar Mar 06, 2018 10:59 pm

Me quedé pensando.
¿Esto te funciona mejor?

Esta es otra de las características de Bash. Sirve para programación sucia, y eso me divierte mucho. Una manera prolija de hacerlo, sería utilizando la variable $!, para averiguar el PID del proceso que acabamos de lanzar, y luego, en el if al final chequear si ese proceso sigue activo. Incluso me parece que sería más preciso un while.
En fin, lo dicho: Bash no sólo permite, diría que hasta fomenta la programación sucia.

Código: Seleccionar todo

#!/bin/bash -x
function abrir (){
	echo $1	
	if xdg-open $1; then ESTADO="abierto";fi
	ESTADO="cerrado"
}
FILE=`zenity --file-selection --title="Select a File"`

case $? in
	0) abrir $FILE
	;;
	1)
		echo "No ha seleccionado ningún archivo."
		exit
		;;
	-1)
		echo "Ha ocurrido un error inesperado."
		;;
esac
if ( echo $ESTADO == "cerrado" ); then $0; fi
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje