Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 23 mensajes ]  Ir a página Anterior  1, 2
Patrocinadores

Autor
Buscar:
Mensaje

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1799

Nota Publicado: Lun Mar 05, 2018 8:42 pm 
Arriba  
Supongo que lo que estás buscando es esto:

Código:
#!/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:
#!/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


 Perfil  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Mié Ago 11, 2010 10:32 am
Mensajes: 3234
Ubicación: Oviedo-es_ES

Nota Publicado: Lun Mar 05, 2018 9:41 pm 
Arriba  
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:

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1799

Nota Publicado: Lun Mar 05, 2018 9:43 pm 
Arriba  
¿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.

 Perfil  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Mié Ago 11, 2010 10:32 am
Mensajes: 3234
Ubicación: Oviedo-es_ES

Nota Publicado: Lun Mar 05, 2018 9:55 pm 
Arriba  
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

 Perfil WWW  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Mié Ago 11, 2010 10:32 am
Mensajes: 3234
Ubicación: Oviedo-es_ES

Nota Publicado: Mar Mar 06, 2018 1:32 am 
Arriba  
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:
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?)

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1799

Nota Publicado: Mar Mar 06, 2018 12:13 pm 
Arriba  
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.

 Perfil  

Desconectado
Forista Ancestral
Forista Ancestral
Avatar de Usuario

Registrado: Mié Ago 11, 2010 10:32 am
Mensajes: 3234
Ubicación: Oviedo-es_ES

Nota Publicado: Mar Mar 06, 2018 4:49 pm 
Arriba  
OK, aclarado, gracias

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

Registrado: Dom Oct 10, 2004 7:00 am
Mensajes: 1799

Nota Publicado: Mar Mar 06, 2018 10:59 pm 
Arriba  
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:
#!/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

 Perfil  
Mostrar mensajes previos:  Ordenar por  
 [ 23 mensajes ]  Ir a página Anterior  1, 2
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
(SOLUCIONADO)Ayuda - Formato texto script bash zenity barra de progreso

en Programación

blackman

5

2258

Vie Abr 13, 2012 2:43 am

Snark1994 Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO