¿Pedir confirmación del usuario antes de ejecutar un script?


8

¿Hay alguna forma de obtener el cuadro de diálogo de tipo Confirmación del usuario (Me gusta, ¿Estás seguro / Sí / No) cuando ejecuto un script (haciendo doble clic)? No me refiero a Terminal, sino a un cuadro de confirmación gráfica, algo como esto: ingrese la descripción de la imagen aquí

(Sé que la imagen es de Windows, no pude encontrar una de Linux)

Respuestas:


13

Hay una manera de usar zenity

zenity --question --text "Are you sure?"

ingrese la descripción de la imagen aquí

Puede probar el estado de salida de ese comando con $?variables, algo como esto: if [ $? -eq 1 ];then exit 1 ; fi. 0es OK, 1es cancelar. Esta construcción funcionará bien si necesita probar el estado de salida de la ventana emergente más tarde, tal vez almacenar $?justo después de que la ventana emergente salga a una variable. Como se discutió en los comentarios, las estructuras como abajo también funcionarán:

if zenity --question --text "Are you sure" 
then
     runSumeFunction
else
     exit 1
 fi

o

 zenity --question --text "Are you sure?" || echo "User isn't sure:/"

2
No necesitas corchetes. Solo hazlo if zenity...ozenity... || exit
Kevin

Se puede hacer de esa manera, pero prefiero un estilo más "tradicional"
Sergiy Kolodyazhnyy

2
Simplemente me pareció bastante tonto probar el estado de salida de un programa ... alimentando su estado de salida a otro programa (o shell incorporado) y luego probando el estado de salida de ese programa.
Kevin

De alguna manera es una tontería, pero se convirtió en una fuerza de hábito
Sergiy Kolodyazhnyy

6

Podrías usar xmessageen el script mismo. Ponga algo como esto después del "shebang":

xmessage "Are you sure?"

Esto mostrará un mensaje gráfico que dice "¿Estás seguro?" con un botón "ok".

Puede configurar xmessagepara tener más de un botón y cambiar lo que está escrito en él. También puede configurar las acciones realizadas por cada botón.

Por ejemplo,

xmessage -buttons ok:0,cancel:1 "Are you sure?"  

Vea man xmessagetodas las opciones (hay muchas).


Gracias ... Esta solución también funciona bien .. Es sólo que muestra un cuadro de diálogo de Zenity mejor mirando .. En términos de funcionalidad, tanto en el trabajo ...
Mayank budhwani

5

En lugar de decirte cómo hacerlo, te diré que no deberías hacerlo.

TL; DR: no cambie su secuencia de comandos. En su lugar, configure su administrador de archivos o descubra por qué sus usuarios lo ejecutan accidentalmente.

EDITAR: Parece que trata su secuencia de comandos de alguna manera especial, como si la configuración general no fuera lo suficientemente buena y su secuencia de comandos necesita una confirmación especial del usuario. Hacer doble clic sobre él es la confirmación. Si descubres que tus usuarios lo ejecutan por accidente, entonces debes averiguar por qué lo hacen y resolverlo. Entonces, su verdadero problema no es cómo solicitar la confirmación, sino cómo evitar que sus usuarios la ejecuten accidentalmente.

Por la forma en que expone su problema, parece que espera que su programa (script) se ejecute navegando hasta donde está el archivo y luego haciendo clic en él desde el administrador de archivos. Piense en todos los demás programas en su sistema. ¿Cuántos comienzas así? ¿Navegas /usr/local/bincuando inicias Firefox? Por supuesto que tú no. Hace clic en él desde el menú de aplicaciones. (gnome tweak es un script de python, tal vez ese sea un mejor ejemplo)

Esperemos que no consideres que hacer clic en él desde el menú de aplicaciones sea un accidente. Entonces, su problema es cómo hacer que su script aparezca allí en lugar de usar el administrador de archivos. Para hacer esto, debe hacer lo siguiente:

  1. coloque su script lejos de los otros archivos donde el usuario puede hacer clic en él por accidente (el lugar típico es /usr/local/bin/para una instalación en todo el sistema o ~/.local/bin/para una instalación del usuario)

  2. crear un archivo de entrada de escritorio (lea las especificaciones estándar ) Aquí hay un caso mínimo:

    [Desktop Entry]
    Name=Your script name
    Exec=path/for/your/script
    Icon=path/for/your/icon/can/be/svg
    Terminal=false
    Type=Application
    

    y empujarlo en /usr/local/share/applications/your-script.xmlo ~/.local/share/your-script.xml.

  3. Finalmente corre update-desktop-database.


Como hace doble clic en el script, es tarea del administrador de archivos confirmarlo. No es el trabajo del script confirmar si debe ejecutarse. Lleva esto al extremo. ¿Te imaginas lo ridículo que sería que cada vez que llamaras a algún programa tuvieras que confirmarlo?

El único momento en que un programa debe pedir confirmación es cuando está a punto de hacer algo posiblemente peligroso e irreversible. Por ejemplo, sobrescribir un archivo o saltear la papelera. Y tenga en cuenta que incluso estos ejemplos tratan de hacer que un programa haga algo específico. No se trata de iniciar tales programas. Si el único propósito de un programa es hacer algo tan peligroso, entonces tampoco debería pedir confirmación.

De hecho, Nautilus (administrador de archivos Gnome) ya le pedirá por defecto que confirme si desea ejecutar un script (o simplemente abrirlo en un editor de texto).

Diálogo de confirmación de Nautilus

Y, por supuesto, este comportamiento es configurable, lo que ofrece al usuario la posibilidad de desactivarlo (entrada de nota en archivos de texto ejecutables ).

Menú de preferencias de Nautilus - pestaña de comportamiento

Por lo tanto, no agregue un diálogo de confirmación molesto a su secuencia de comandos. Configure su administrador de archivos correctamente. Y deja que tus usuarios hagan lo mismo.


1
Esto no es realmente una solución, ya que no se puede compartir de manera fácil y segura con otros.
Ismael Miguel

Gracias ... sé cómo hacerlo ... Pero esto agrega una confirmación a todos los scipts ... Lo quiero para un guión en particular ...
mayank budhwani

@IsmaelMiguel pero ese es el punto central de la respuesta. No debe ser compartido. Hay dos cosas diferentes, la acción del programa y el comportamiento / experiencia del sistema. No deberías fusionar los dos.
carandraug

@IsmaelMiguel esta respuesta señala el antipatrón de lo que el usuario quiere hacer. No le da el pescado al autor de la pregunta porque es alérgico.
Braiam

@mayankbudhwani todavía está resolviendo el problema incorrecto. ¿Por qué es especial ese guión en particular? Si sus usuarios hacen clic en él por accidente, ese es un problema diferente. He editado la respuesta con otro enfoque.
carandraug

2

Puede usar yad, que es como zenity en esteroides, ya que es mucho más configurable. Puede instalarlo desde el Centro de software en Ubuntu. En su forma más básica, puede escribir

yad --title=Question --image=dialog-question --text="Are you sure?"

y deberías ver esto: captura de pantalla 1

Si se presionó OK, obtenemos un código de retorno de 0, si se presionó Cancelar, obtenemos un código de retorno de 1.

Sería mejor poner el cuadro en el centro y también ajustar el ancho del mismo, usar una pestaña principal para colocar el texto "¿Está seguro?" más a la derecha y también tenerlo siempre arriba. Para esto necesitamos:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200

La mayoría de los interruptores se explican por sí mismos, excepto el "\ t" antes del "¿Está seguro?" que simplemente agrega un espacio de tabulación antes de imprimir el texto. Ahora deberíamos ver esto:ingrese la descripción de la imagen aquí

La caja está centrada, siempre en la parte superior y se ve mejor. Para establecer una variable para probar qué botón se presionó, use:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200;result=$?;echo $result

En este ejemplo, estamos utilizando la variable $ resultado que se establecerá en 0 si se presionó OK o en 1 si se presionó Cancelar.

Para obtener ayuda con yad, puede usar man yado, yad --help-allpero descubrí que los ejemplos prácticos son más fáciles de adaptar. Hay algunos aquí . yad es mucho más configurable y, por lo tanto, más utilizable que zenity en mi opinión.


En caso de que ayude a alguien, publiqué el uso de yad una vez antes. Puedes verlo aquí: askubuntu.com/questions/488350/…
Scooby-2
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.