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 1, 2  Siguiente
Patrocinadores

Autor
Buscar:
Mensaje

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 Feb 27, 2018 2:13 pm 
Arriba  
estoy 'investigando' sobre las ventanas de zenity. Vale, algunas ya están 'dominadas' pero (como es lógico que nos pase a los que nos metemos en líos de programación sin tener ni idea del tema), estoy atascado en el 'dialogo zenity para listas'.
A ver, he llegado a crear este comienzo de script...
Código:
#!/bin/bash

zenity --list --title="Que es lo que quiere hacer" --width="340" --height="200" --radiolist  \
--column=" " --column="Opción a elegir"  \
FALSE "CREAR un nuevo script" \
FALSE "EJECUTAR uno ya creado" \
FALSE "Salir"

que me proporciona esta bonita ventana de lista:
Imagen

Pero, a partir de aquí, lo que quiero es que cuando marque alguna de las opciones (y primera columna quede, entonces, en TRUE), se ejecute una acción que sería, por ejemplo...
a) si marco la opción 'CREAR un nuevo script' me arranque un editor de textos (por ejemplo, gedit), se escriba en él el encabezamiento (o sea, eso de '#!/bin/bash', para ahorrarme escribirlo, y (ya manualmente) pueda escribir las instrucciones pertinentes, y al final, guardarlo.
(hombre, puede valer una solución más sencilla, redirigir el 'TRUE' a la instrucción (por ejemplo)
gedit plantillaScript.txt
habiendo creado previamente ese archivo 'plantillaScript.txt'

b) si marco la opción 'EJECUTAR uno ya creado' es sencillo, ya me he creado un 'script para ejecutar scripts' (con 'zenity --file-selection', claro) y me bastaría redirigir este TRUE a la instrucción (por consola)
sh script_ejecutaSCRIPT
(donde lo busco, y lo ejecuto)

c) y la tercera opción, si es caso, para salir (o, a lo mejor, para borrar lo marcado, y volver a empezar con todo en FALSE)

Pues no se si me he explicado bien, pero aquí dejo mi 'atasco intelectual' de las últimas 36 horas. Help me...!

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

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

Nota Publicado: Mié Feb 28, 2018 3:38 am 
Arriba  
El esqueleto de lo que estás indagando es así:
Código:
variable=$(zenity --list --title="Que es lo que quiere hacer" --width="340" --height="200" --radiolist  \
--column=" " --column="Opción a elegir"  \
FALSE "CREAR un nuevo script" \
FALSE "EJECUTAR uno ya creado" \
FALSE "Salir"
)

case $variable in
"CREAR un nuevo script")
    zenity --info --text="nuevo script"
    ;;
"EJECUTAR uno ya creado")
    zenity --info --text="ya creado"
    ;;
"Salir")
    zenity --info --text="salir"
    ;;
   
esac


Como ves, el resultado de la selección hay que guardarlo en algún lado. Normalmente, en una variable a la que llamé, en un arrebato de imaginación (y para evitar confusiones), "variable".

Luego se utiliza un condicional, en este caso "case", para decidir qué hacer en función de uno u otro resultado.

Presta atencíon a los punto y coma, a los paréntesis, a las comillas. Lo más engorroso de esto es revisar esas pequeñas fallas que podemos cometer al escribir, que en cualquier programa son fatales. De todos modos, al ejecutarlo el mismo sistema te dirá, aproximadamente, en qué línea está la falla.

Luego están las convenciones de cada lenguaje. En el caso de Bash, los condicionales deben cerrarse. El condicional por excelencia, "if", tiene la estructura "if {algo -comparación - algo}; then acción; else acción; fi". El otro condicional, "case", lo ves acá, y se cierra con "esac".

Y ambas estructuras pueden anidarse, pero eso ya es irse por las ramas en este thread.

En un rato veo si le agrego algo útil, al menos a una de las opciones.

Editado -- Mar Feb 27, 2018 10:33 pm --

Bueno, esto hace algo, al menos.
Código:
variable=$(zenity --list --title="Que es lo que quiere hacer" --width="340" --height="200" --radiolist  \
--column=" " --column="Opción a elegir"  \
FALSE "CREAR un nuevo script" \
FALSE "EJECUTAR uno ya creado" \
FALSE "Perder el tiempo" \
FALSE "Salir"

)
case $variable in
"CREAR un nuevo script")
    #zenity --info --text="nuevo script"
    NEWSCRIPT=`tempfile`
    echo '#!/bin/bash'>$NEWSCRIPT
    echo ''>>$NEWSCRIPT
    gedit +2:1 $NEWSCRIPT
   
    ;;
"EJECUTAR uno ya creado")
    zenity --info --text="Acá habría que ejecutar un script, u otro menú que permita elegir un script"
    ;;
"Perder el tiempo")
    for i in `seq 1 100`; do echo $i && sleep 1|zenity --progress --pulsate --auto-close --text="contando cien segundos=`echo $i`";done
    ;;
"Salir")
    zenity --timeout=1 --info --text="BYE"
    exit
    ;;
   
esac



Y no quiero complicarte demasiado las cosas, pero por cuestiones de claridad, normalmente uno pondría la acción en una función.
En este hilo, en la última de mis respuestas, puedes ver dos funciones. La gracia es que si escribes las funciones afuera de la estructura principal, y las llamas, por ejemplo function nuevoscript, adentro, en lugar de hacer todo esto, sólo debes poner nuevoscript, y funciona como un comando cualquiera, que ejecuta todo lo que esté en la función.


Última edición por neurus el Mié Feb 28, 2018 3:49 am, editado 1 vez en total
 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: Mié Feb 28, 2018 3:49 am 
Arriba  
ostras... ya tengo plan para mañana (aquí, en es-ES, son ahora las 3 de la madrugada... y me voy de cabeza a la cama)
¡¡Gracias...!!

 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: Mié Feb 28, 2018 7:11 pm 
Arriba  
¡Mierda...! no me funcionan...
A ver, recapitulo (voy a hacerlo con un modelo de 'list' más fácil):
Primero: creo la estructura de la 'lista zenity': por ejemplo...
Citar:
zenity --list --width="300" --height="200" \
--title="Elige lo que deseas hacer" --column="Opción a elegir" \
"CREAR un nuevo script" \
"EJECUTAR uno ya creado" \
"Hacer un Sudoku" \
"Salir"

esto funciona: si copio esa estructura en una terminal, se abre el diálogo, puedo seleccionl la opción que quiera......
Imagen
y si, seleccionada una, doy al ENTER, me aparece el texto de la que he elegido, así...
Imagen

Segundo: (ahora vienen los líos) entiendo que tengo que asignar ese texto a una 'Variable', que llamaré DATO. Y crearme otras variabñes, para simplificar. La 'pieza' siguiente que tengo que añadir al script, sería algocomo esto:
Código:
# VARIABLES DEFINIDAS
DATO=$(zenity --list \
--width="300" --height="200"  \
--title="Elige lo que deseas hacer" \
--column="Opción a elegir" \
"CREAR un nuevo script" \
"EJECUTAR uno ya creado" \
"Salir")
 #
CREA="gedit MODELO_SCRIPT"
EJEC="sh script_ejecutaSCRIPT"

(este documento de texto 'MODELO_SCRIPT' y el 'script_ejecutaSCRIPT' los tengo hechos, y funcionan perfectamente)
También probé llamando
DATO=$?
que leí por ahí que es como se define la última salida del comando
Y Tercero el último paso para montar el script sería incluir las condicionales. Probé con CASE...
Citar:
#ASIGNACIÓN DE VARIABLES
case $DATO in
"CREAR un nuevo script" )
$INIC ;;
"EJECUTAR uno ya creado" )
$CREA ;;
"Salir")
    zenity --timeout=1 --info --text="BYE"
    exit   ;;
esac

y, montado el script (con las tres fases que indico), no funciona, me repite la ventana de diálogo del punto Primero, y no pasa de ahí.

También probé con if...
Citar:
#ASIGNACIÓN DE VARIABLES
if [ $DATO="CREAR un nuevo script" ];then
$INIC
fi
if [ $DATO="EJECUTAR uno ya creado" ];then
$OPEN
fi
if [ $DATO="Salir" ];then
exit
fi

y lo único que consigo es que funcione... pero se lancen a la vez todas las opciones (crear y ejecutar)

Así que estoy bloqueado... y desanimado. Me temo que esto no es para 'aficionadillos'...
(¡Ah! y el script final me da...
Citar:
doc@debian:~$ sh script_LISTA3
Esta opción no está disponible. Por favor vea --help para todos los usos posibles.
Esta opción no está disponible. Por favor vea --help para todos los usos posibles.
doc@debian:~$

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

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

Nota Publicado: Mié Feb 28, 2018 11:52 pm 
Arriba  
Usa las etiquetas code. Así es muy difícil leer el código.

Lo probé en mi máquina. Más allá del modo un tanto sui generis de usar las variables, el script funciona. Excepto porque llamas a una variable vacía ($INIC) y que usas crear nuevo script donde eliges ejecutar uno ya creado.

Esto es tu script (corregido $INIC para que haga algo).
Código:
#!/bin/bash
# VARIABLES DEFINIDAS
DATO=$(zenity --list \
    --width="300" --height="200" \
    --title="Elige lo que deseas hacer" \
    --column="Opción a elegir" \
    "CREAR un nuevo script" \
    "EJECUTAR uno ya creado" \
    "Salir")
#
CREA="gedit MODELO_SCRIPT"
EJEC="sh script_ejecutaSCRIPT"
#ASIGNACIÓN DE VARIABLES
case $DATO in
    "CREAR un nuevo script" )
        zenity --info --text=$CREA ;;
    "EJECUTAR uno ya creado" )
        $CREA ;;
    "Salir")
        zenity --timeout=1 --info --text="BYE"
    exit   ;;
esac




Esto es lo mismo, algo más prolijo:
Código:
#!/bin/bash

#funciones

function crear (){
    gedit MODELO_SCRIPT
}

function menuscript (){
    zenity --info --text="elija script"
}

function salir(){
    zenity --timeout=1 --info --text="BYE"
    exit
   
}





# VARIABLES DEFINIDAS
DATO=$(zenity --list \
    --width="300" --height="200" \
    --title="Elige lo que deseas hacer" \
    --column="Opción a elegir" \
    "CREAR un nuevo script" \
    "EJECUTAR uno ya creado" \
    "Salir")
#



case $DATO in
    "CREAR un nuevo script" )
        crear
       ;;
    "EJECUTAR uno ya creado" )
        menuscript
     ;;
     
    "Salir")
        salir
     ;;
esac


Veo que sacaste la opción radiolist, aunque funcionaría igual. En menuscript no puse ningún menú, obviamente.

Lo otro, la prueba con el if, a simple vista veo que está mal usado. O debería estar anidado, o deberías usar elif. Y en cualquier caso la comparación en Bash no se hace con "=" sino con "==". Dejando un espacio, además, a cada lado del signo. Un igual asigna valor a una variable.
Acá:
Código:
if [ $DATO="EJECUTAR uno ya creado" ];then .. etc

le estás asignando a la variable dato, el valor "EJECUTAR etc". Como el if ejecuta la acción si la condición es verdadera, y la condición siempre será verdadera (variable="texto" nunca va a ser false) la acción se ejecuta.
Luego abres otro if, le asignas a DATO otro valor, vuelve a ser verdadero, se ejecuta la siguiente acción, y así ad aeternum.

 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: Jue Mar 01, 2018 12:56 am 
Arriba  
hola, neurus, buenas noches (aquí, en es-ES)
primero, perdón por no usar las <code>, me despisté.
segundo: hoy tendré que estar poco tiempo, mañana tengo analítica a las 8:30 (tengo que ir en ayunas) y no es cuestión de quedarme, como estos días, hasta las 3:00
tercero: sospecho que hay algo raro en mi Debian, a ti te funcionan los scripts que pones (o me corriges)... y a mi, en mi PC, por mas copy&paste que hago... sencillamente no van.
y cuarto: qué pena, me parece que todo esto supera mis conocimientos, y no voy a estar agobiando (y agobiándome) con este problemilla tan puntual, y que solo es un juego.
Me parece que voy a intentar tomarme uno o dos días de 'reflexión activa', repasaré todo, volveré a buscar por Google a ver si se me aclara algún concepto que tenga despistado, porque sigo sin tener claro como pasar lo que selecciono en una lista Zenity (sea la última, o la de los 'radiolist', eso de argumentos, salida estandar, etc) y si no... pues 'hasta aquí hemos llegado'.
(A lo mejor tendré que ver qué es eso de 'clipgrab'...) :D :D
Gracias, Diego.

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

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

Nota Publicado: Jue Mar 01, 2018 1:00 am 
Arriba  
En cualquier caso, siempre es recomendable probar los scripts con la opción:
#!/bin/bash -x

Y ejecutarlos desde una terminal. Ahí vas a saber exactamente en qué punto falla.

 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: Jue Mar 01, 2018 1:16 am 
Arriba  
oye, una pregunta tonta... ¿por qué, en el último 'script' que me has desarrollado me pones eso de las 'funciones'
Código:
#funciones

function crear (){
    gedit MODELO_SCRIPT
}

function menuscript (){
    zenity --info --text="elija script"
}

function salir(){
    zenity --timeout=1 --info --text="BYE"
    exit
   
}

...si luego, en lo que sigue del script, no se vuelven a mencionar/invocar?

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

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

Nota Publicado: Jue Mar 01, 2018 1:54 am 
Arriba  
Sí, se mencionan. Lo que se ejecuta es el nombre de la función (esto se hace normalmente con funciones, no con variables como en tu script; las variables son para guardar datos).

Código:
case $DATO in
    "CREAR un nuevo script" )
        crear <--llamada a la función crear
       ;;
    "EJECUTAR uno ya creado" )
        menuscript <--llamada a la función menuscript
     ;;
     
    "Salir")
        salir <--llamada a la función salir
     ;;
esac


Puedes ver las funciones como "micro scripts", que idealmente realizan una -y sólo una- acción. Pueden recibir parámetros, combinarse entre sí, y acabar realizando juntas tareas más o menos complejas.

 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: Jue Mar 01, 2018 2:01 am 
Arriba  
¡OK, aclarado...!
bueno, diablos, me voy a la cama, que me suena el despertador dentro de 6 horas.
bye...

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

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

Nota Publicado: Jue Mar 01, 2018 1:58 pm 
Arriba  
Veo que tienes complicaciones para entender algunos conceptos de los utilizados en el script. Vamos paso a paso, a ver si así es más fácil.
Una variable es un espacio en memoria para guardar un dato. A ese espacio se lo señala con una palabra. Cada lenguaje tiene sus reglas pero, en general, no puede contener caracteres especiales, espacios o empezar con números.
En una variable, puedo guardar un dato de manera directa, o el dato que resulta de la ejecución de un comando.
Si hago:

Código:
VAR="esto es una prueba"
y luego echo $VAR, la consola me responderá con el contenido de la variable.

Para guardar en una variable el contenido de un comando, debo aclarar que lo que estoy pidiendo es la ejecución de un comando. Hay dos nomenclaturas correctas para eso en Bash: el comando entre acentos invertidos, `gedit test`; o entre corchetes antecedidos por signo monetario, $(gedit test).

El ejemplo anterior (gedit test), tiene truco: precisamente es un comando que no se puede guardar en una variable, porque no da una respuesta. Sí funciona, por ejemplo:

Código:
VAR=$(ls ~)

Para ver el resultado: echo $VAR.

El contenido de una variable se sobreescribe cada vez que se le asigna valor (hay maneras de concatenar, no vamos a complicarnos con eso ahora).

Es decir, en nuestro ejemplo, ya le asignamos valor varias veces a $VAR. Su contenido, en cada caso, es el último valor que le hayamos asignado mediante el signo igual. Incluso podríamos vaciarla, haciendo VAR="".

Un último detalle: a diferencia de la mayoría de los lenguajes, en Bash, cuando asignamos valor a una variable, no necesitamos antecederla con $. Sólo es obligatorio cuando queremos ver su contenido. Esa es la razón de que en el script, la primera vez digamos "DATO=$(zenity...etc)", y luego usemos $DATO

En nuestro caso, queremos ejecutar Zenity, y queremos guardar el resultado en algún lado (una variable) para después hacer algo en función del contenido de esa variable.

Debemos:

1) crear la variable.
2) ejecutar zenity y guardar el resultado en la variable anterior.
3) "mirar" dentro de la variable y decidir qué hacer según lo que haya dentro.
4) hacerlo.

Entonces, nuestro primer paso es:
Código:
DATO=$(zenity --list \
    --width="300" --height="200" \
    --title="Elige lo que deseas hacer" \
    --column="Opción a elegir" \
    "CREAR un nuevo script" \
    "EJECUTAR uno ya creado" \
    "Salir")


Que guarda el contenido de la elección del usuario en la variable $DATO.
Ahora hay que seleccionar qué hacer en cada caso. Para eso sirve la estructura case-esac.
Por ahora no te preocupes por los comandos inexistentes "crear, menuscript y salir".

Código:


case $DATO in
    "CREAR un nuevo script" )
        crear
       ;;
    "EJECUTAR uno ya creado" )
        menuscript
     ;;
     
    "Salir")
        salir
     ;;
esac



Con esto, ya está la estructura básica. Ahora hay que definir qué significan los comandos "crear, menuscript y salir". Para entenderlo, tomemos uno como ejemplo, digamos "salir": exactamente en ese lugar, podríamos escribir uno o muchos comandos. Al cumplirse la condición, el script ejecutará todos los comandos que haya antes de los ;;.
Para esto sirven las funciones. En una función puedo agrupar tantas sentencias como quiera, englobarlas bajo un nombre único -preferentemente buscaremos que no colisione con el nombre de algún comando del sistema- y luego llamamos a esa función por su nombre. A fines prácticos, para el script no hay diferencia formal o de "categoría" entre tu función llamada pepito, y el comando de sistema apt-get. Ambas se llaman igual, como un comando (una salvedad: sí hay una distinción de precedencia que no vale la pena tratar aquí).

Entonces, armamos nuestras funciones:

Código:
function crear (){
    gedit MODELO_SCRIPT
}

function menuscript (){
    zenity --info --text="elija script"
}

function salir(){
    zenity --timeout=1 --info --text="BYE"
    exit
   
}


Nota: como el programa se lee de arriba hacia abajo, las funciones deben estar declaradas antes de llamarlas. Lo más práctico es escribirlas arriba de todo, para mantener cierto orden.

A partir de ahora, dentro del script, cuando necesitemos salir, por ejemplo, no hará falta que escribamos
Código:
   zenity --timeout=1 --info --text="BYE"
    exit

Nos bastará con escribir salir.

El sentido práctico de esto es, además, que en caso de necesitar realizar varias veces la misma acción, no deberemos escribir la misma larga sucesión de comandos cada vez. Nos basta con escribir una palabra: el nombre de la función.

En el post que armaste alguna vez para ponerle hora y fecha a las líneas de un log, en mi última respuesta están las funciones hora y fecha. Si miras el script, adentro se vuelven a llamar varias veces. Ese es un ejemplo relativamente simple.

Y con esto está listo el script.
Estoy en Windows, en la oficina. Los ejemplos deberían funcionar, pero nada de lo escrito acá fue probado en una consola real.

 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: Jue Mar 01, 2018 3:12 pm 
Arriba  
una lección 'magistral'. Precisamente andaba yo, estos días, en paralelo, preparando algunas cositas sobre Zenity, para mi Blog, y la primera entrada de una serie de 3 o 4 la comenzaba con esto:
Citar:
Scripting con Zenity… para newbies (I)
Estoy seguro de que esta entrada del Blog va a producir grandes carcajadas entre los gurús de informática que la lean, por ejemplo a mi amigo ‘neurus’ de EspacioLinux.com, que tanto me ayuda, y del que se que, a veces, visita este Blog...

y es que, como introducción al tema, quería resumir (y 'resumirme') algunos conceptos básicos sobre programación en Bash... y me estaba embarullando bastante con las variables, los comandos, las órdenes o sentencias, los argumentos y las funciones... (esos días de reflexión que anuncié eran para eso, para ver si podía salir del 'bucle' y tener claras algunas ideas básicas).
Así que me toca 'digerir' todo lo que me cuentas.
Agradezco mucho tu 'paciencia'.

 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: Vie Mar 02, 2018 12:32 am 
Arriba  
ESTOY ENCANTADO...
Al fin he conseguido hacer funcionar un script con las listas zenity. He descubierto una cosa, que parece que existen 'pequeños duendes' dentro de los scripts (no se si serán 'microespacios' que sobran o faltan o simplememte eso, duendes'), que parece ser que acaban desactivándose uniendo o separando, o volviendo a separar y/o a unir... líneas, y al final al fin funciona todo OK.
Neurus, amigo, siguiendo tus lecciones sobre funciones, variables (y tu estructura de script, vamos), he conseguido que esto me funcione:
Código:
#!/bin/bash

#funciones
function crear ()
{
gedit MODELO_SCRIPT
}
function menuscript ()
{
sh script_ejecutaSCRIPT
}
function foroEL ()
{
`/usr/bin/firefox http://www.espaciolinux.com/foros/`
exit
}
function salir ()
{
zenity --timeout=1 --info --text="BYE"
exit
}

# VARIABLES DEFINIDAS

DATO=$(zenity --list \
--width="300" --height="200" \
--title="Elige lo que deseas hacer" \
--column="Opción a elegir" \
"CREAR un nuevo script" \
"EJECUTAR uno ya creado" \
"Visitar el Foro Espacio Linux" \
"Salir")
#
case $DATO in
"CREAR un nuevo script")
crear
;;
"EJECUTAR uno ya creado")
menuscript
;;
"Visitar el Foro Espacio Linux" )
foroEL
;;
"Salir")
salir
;;
esac


¡Ah, y por cierto: me funcionaba con el mandato
Código:
~$ bash nombre_script

(en vez de con sh nombre_script)

Continuaré mis investigaciones, ahora tengo que ver si leo algo sobre 'debugging' (y si es aplicable, el comando 'sh -n nombre_script no parece que funcione) y, sobre todo, cómo puedo hacer, siguiendo con el tema de las listas zenity, que una vez ejecutada (y cerrada) la opción elegida... me vuelva a la ventana zenity de selección inicial, paar decidir si hago otra cosa... o le doy a la opción 'Salir'

Gracias, Diego (E) :wink:

 Perfil WWW  

Desconectado
Forista Legendario
Forista Legendario
Avatar de Usuario

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

Nota Publicado: Vie Mar 02, 2018 3:08 am 
Arriba  
doc escribió:
... y, sobre todo, cómo puedo hacer, siguiendo con el tema de las listas zenity, que una vez ejecutada (y cerrada) la opción elegida... me vuelva a la ventana zenity de selección inicial, paar decidir si hago otra cosa... o le doy a la opción 'Salir'


En principio, habría dos formas de hacer eso.
1) la "canónica": meter todo dentro de un bucle while, del cual se saldría al cumplir cierta condición. No es difícil, pero creo que aún no cuentas con conocimientos para ello.
2) Tener en cuenta que en Bash, existen variables por defecto: $0 es el propio script. $1 es el primer parámetro, $2 es el segundo, etc.
Así como al comienzo de este tema, armamos un script que recibía como parámetro el archivo con una lista de videos, podríamos armar un script que recibiera como parámetros más cosas.
Por otra parte, & permite ejecutar varios comandos a la vez mandando el anterior a segundo plano. && permite ejecutar un nuevo comando cuando se haya terminado exitosamente el primero.
En definitiva, sobre lo que preguntas: algo como crear & $0 funcionaría perfectamente.

PD: relee de qué modo se atrapa el resultado de un comando en una variable. Hay un error en la última entrada de tu blog.

 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 7:10 pm 
Arriba  
neurus, abusando de tu paciencia... y viendo lo último que me dices sobre volver a reiniciar el script (y siguiendo con mi 'reto' del scripting con Zenity), para seguir aprendiendo he creado este script, que llamo 'pruebasel.sh'
Código:
#!/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"
#
proceso=`xdg-open "$FILE"`
if [ $proceso = "false" ]
then
bash pruebasel.sh
done

que me sirve para buscar y ejecutar cualquier tipo de archivo (que tenga asociada una aplicación).
La parte final (desde '#') está hecha con la idea de que, ejecutado un archivo (una hoja excel, un PDF, una imagen JPG, un 'powerpoint'... gran invento el comando 'xdg-open' que acabo de descubrir), al cerrarlo me vuelva a arrancar el script por si quiero buscar o seleccionar otro


Intenté, al principio, meter el condicional while-do-done, incluso el until-do-done... pero tampoco van y, por supuesto, no tengo claro cómo hay que ponerlo... ni si estoy escribiendo 'herejías' y los que sabeis del tema me vais a llevar a la hoguera :D :D

(nota: esa parte del script con 'case' lo copié directamente del manual (supongo que oficioso) de Zenity https://help.gnome.org/users/zenity/3.24/entry.html.es y aunque, más o menos, lo entiendo, no me preguntes por ello)

 Perfil WWW  
Mostrar mensajes previos:  Ordenar por  
 [ 23 mensajes ]  Ir a página 1, 2  Siguiente
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 3 invitados

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