Richiedere la conferma dell'utente prima di eseguire uno script?


8

Esiste un modo per ottenere la finestra di dialogo di tipo Conferma utente (Like Are You Sure-Yes / No) quando eseguo uno script (facendo doppio clic)? Non intendo in Terminale, ma una casella di conferma grafica, qualcosa del genere: inserisci qui la descrizione dell'immagine

(So ​​che l'immagine proviene da Windows, non sono riuscito a trovarne uno Linux)

Risposte:


13

C'è un modo per usare zenity

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

inserisci qui la descrizione dell'immagine

È possibile verificare lo stato di uscita di questo comando con $?variabili, qualcosa di simile a questo: if [ $? -eq 1 ];then exit 1 ; fi. 0è OK, 1è annulla. Questo costrutto funzionerà bene se è necessario testare lo stato di uscita del popup in un secondo momento, magari memorizzarlo $?subito dopo che il popup è uscito da una variabile. Come discusso nei commenti, anche strutture come muggito funzioneranno:

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
Non hai bisogno di parentesi quadre. Basta fare if zenity...ozenity... || exit
Kevin,

Può essere fatto in questo modo, ma preferisco uno stile più "tradizionale"
Sergiy Kolodyazhnyy,

2
Mi è sembrato piuttosto sciocco testare lo stato di uscita di un programma ... fornendo il suo stato di uscita a un altro programma (o shell incorporato) e quindi testando lo stato di uscita di quello.
Kevin,

È un po 'sciocco, ma è diventato una forza dell'abitudine
Sergiy Kolodyazhnyy,

6

È possibile utilizzare xmessagenello script stesso. Metti qualcosa del genere dopo lo "shebang":

xmessage "Are you sure?"

Verrà visualizzato un messaggio grafico che dice "Sei sicuro?" con un pulsante "ok".

Puoi configurare xmessageper avere più di un pulsante e cambiare ciò che è scritto in esso. È inoltre possibile configurare le azioni eseguite da ciascun pulsante.

Per esempio,

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

Vedi man xmessagetutte le opzioni (ce ne sono molte).


Grazie ... Questa soluzione funziona anche bene .. È solo che Zenity mostra una finestra di dialogo più bella .. In termini di funzionalità, entrambi funzionano ...
May Budhwani,

5

Invece di dirti come farlo, ti dirò che non dovresti farlo.

TL; DR - Non modificare lo script. Invece configura il tuo file manager o scopri perché gli utenti lo eseguono accidentalmente.

EDIT: sembri considerare lo script come in qualche modo speciale, come se le impostazioni generali non fossero abbastanza buone e lo script necessitasse di una conferma speciale da parte dell'utente. Fare doppio clic su di esso è la conferma. Se scopri che i tuoi utenti lo eseguono per caso, devi capire perché lo fanno e risolverlo invece. Quindi il tuo vero problema non è come richiedere la conferma ma come impedire agli utenti di eseguirlo accidentalmente.

Dal modo in cui esponi il tuo problema sembra che ti aspetti che il tuo programma (script) venga eseguito navigando verso dove si trova il file e quindi facendo clic su di esso dal file manager. Pensa a tutti gli altri programmi nel tuo sistema. Quanti ne inizi così? Ti navigare a /usr/local/binquando si avvia Firefox? Certo che no. Fai clic su di esso dal menu delle applicazioni. (gnome tweak è uno script in pitone forse è un esempio migliore)

Spero che non consideri un clic su di esso dal menu delle applicazioni un incidente. Quindi il tuo problema diventa come far apparire lo script lì invece di usare il file manager. Per fare questo, fai le seguenti cose:

  1. posizionare lo script lontano dagli altri file in cui l'utente può fare clic su di esso per errore (il luogo tipico è /usr/local/bin/per un'installazione a livello di sistema o ~/.local/bin/per un'installazione utente)

  2. creare un file Voce desktop (leggere le specifiche standard ). Ecco un caso minimo:

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

    e spingerlo dentro /usr/local/share/applications/your-script.xmlo ~/.local/share/your-script.xml.

  3. Finalmente corri update-desktop-database.


Dato che fai doppio clic sullo script, è compito del tuo file manager confermarlo. Non è compito dello script confermare se deve essere eseguito. Porta questo all'estremo. Riesci a immaginare quanto sarebbe ridicolo che ogni volta che chiamassi un programma dovessi confermarlo?

L'unica volta in cui un programma dovrebbe chiedere conferma è quando sta per fare qualcosa di potenzialmente pericoloso e irreversibile. Ad esempio, sovrascrivendo un file o ignorando il cestino. E nota che anche questi esempi riguardano come fare in modo che un programma faccia qualcosa di specifico. Non si tratta di avviare tali programmi. Se un solo scopo del programma è fare una cosa così pericolosa, allora non dovrebbe nemmeno chiedere conferma.

Infatti, Nautilus (gestore dei file Gnome) ti chiederà già di default se vuoi eseguire uno script (o semplicemente aprirlo in un editor di testo).

Finestra di dialogo di conferma Nautilus

E, naturalmente, questo comportamento è configurabile, dando all'utente la possibilità di disattivarlo (nota nota su file di testo eseguibili ).

Menu delle preferenze di Nautilus - scheda comportamento

Quindi non aggiungere una fastidiosa finestra di dialogo di conferma al tuo script. Configura correttamente il tuo file manager. E lascia che i tuoi utenti facciano lo stesso.


1
Questa non è davvero una soluzione, dal momento che non può essere condivisa facilmente e in sicurezza con gli altri.
Ismael Miguel,

Grazie ... So come farlo .. Ma questo aggiunge una conferma a tutti gli sceneggiatori ... Lo voglio per una sceneggiatura particolare ...
Mayh Budhwani,

@IsmaelMiguel ma questo è il punto centrale della risposta. Non dovrebbe essere condiviso. Ci sono due cose diverse, l'azione del programma e il comportamento / esperienza del sistema. Non dovresti unire i due.
carandraug,

@IsmaelMiguel questa risposta sottolinea l'anti-schema di ciò che l'utente vuole fare. Non dà il pesce al richiedente perché è allergico.
Braiam,

@mayankbudhwani stai ancora risolvendo il problema sbagliato. Perché quella particolare sceneggiatura è speciale? Se i tuoi utenti lo fanno clic per errore, si tratta di un problema diverso. Ho modificato la risposta con un altro approccio.
carandraug,

2

Puoi usare yad, che è come la zenità degli steroidi in quanto è molto più configurabile. Puoi installarlo dal Software Center in Ubuntu. Nella sua forma più semplice, puoi digitare

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

e dovresti vedere questo: screenshot 1

Se si preme OK, si ottiene un codice di ritorno di 0, se si preme Annulla, si ottiene un codice di ritorno di 1.

Sarebbe meglio mettere la scatola al centro e anche regolarne la larghezza, utilizzare una scheda iniziale per posizionare il testo "Sei sicuro?" più a destra e anche averlo sempre in primo piano. Per questo abbiamo bisogno di:

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

La maggior parte degli interruttori sono autoesplicativi ad eccezione di "\ t" prima di "Sei sicuro?" che aggiunge semplicemente uno spazio di tabulazione prima di stampare il testo. Ora dovremmo vedere questo:inserisci qui la descrizione dell'immagine

La scatola è centrata, sempre in alto e ha un aspetto migliore. Per impostare una variabile per verificare quale pulsante è stato premuto, utilizzare:

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

In questo esempio stiamo usando la variabile $ risultato che sarà impostata su 0 se è stato premuto OK o su 1 se è stato premuto Annulla.

Per aiuto con yad puoi usare man yado yad --help-allma ho trovato esempi pratici più facili da adattare. Ce ne sono alcuni qui . yad è molto più configurabile e quindi più utilizzabile della zenità secondo me.


Nel caso in cui aiuti chiunque abbia pubblicato l'utilizzo di yad una volta prima. Puoi vederlo qui: askubuntu.com/questions/488350/…
Scooby-2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.