Bitten Sie den Benutzer um Bestätigung, bevor Sie ein Skript ausführen?

8

Gibt es eine Möglichkeit, ein Dialogfeld vom Typ Benutzerbestätigung (wie Sind Sie sicher - Ja / Nein) zu erhalten, wenn ich ein Skript ausführe (durch Doppelklick)? Ich meine nicht in Terminal, sondern eine grafische Bestätigungsbox, so etwas wie diese: Geben Sie hier die Bildbeschreibung ein

(Ich weiß, dass das Image von Windows stammt, ich konnte kein Linux finden)

Mayank Budhwani
quelle

Antworten:

13

Es gibt einen Weg mit zenity

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

Geben Sie hier die Bildbeschreibung ein

Sie können den Exit-Status dieses Befehls mit einer $?Variablen wie folgt testen : if [ $? -eq 1 ];then exit 1 ; fi. 0ist OK, 1ist abzubrechen. Dieses Konstrukt funktioniert gut, wenn Sie den Exit-Status des Popups später testen müssen. Speichern Sie es möglicherweise $?direkt nach dem Beenden des Popups in einer Variablen. Wie in den Kommentaren erläutert, funktionieren auch Strukturen wie unten:

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

oder

 zenity --question --text "Are you sure?" || echo "User isn't sure:/"
Sergiy Kolodyazhnyy
quelle
2
Sie brauchen keine eckigen Klammern. Tun Sie einfach if zenity...oderzenity... || exit
Kevin
Kann so gemacht werden, aber ich bevorzuge eher "traditionellen" Stil
Sergiy Kolodyazhnyy
2
Es kam mir einfach ziemlich albern vor, den Exit-Status eines Programms zu testen, indem ... der Exit-Status einem anderen Programm (oder einer eingebauten Shell) zugeführt und dann der Exit-Status dieses Programms getestet wurde.
Kevin
Es ist etwas albern, aber es wurde eine Kraft der Gewohnheit
Sergiy Kolodyazhnyy
6

Sie können xmessageim Skript selbst verwenden. Setzen Sie so etwas nach dem "shebang":

xmessage "Are you sure?"

Daraufhin wird eine grafische Meldung mit der Aufschrift "Sind Sie sicher?" Angezeigt. mit einem "okay" Knopf.

Sie können xmessagemehr als eine Schaltfläche konfigurieren und die darin enthaltenen Informationen ändern. Sie können auch die Aktionen konfigurieren, die von jeder Schaltfläche ausgeführt werden.

Zum Beispiel,

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

Sehen Sie man xmessagefür alle Optionen (es gibt viele von ihnen).

Eduardo Cola
quelle
Danke ... Diese Lösung funktioniert auch gut. Es ist nur so, dass Zenity einen besser aussehenden Dialog anzeigt. In Bezug auf die Funktionalität funktionieren beide ...
Mayank Budhwani
5

Anstatt Ihnen zu sagen, wie es geht, werde ich Ihnen sagen, dass Sie das nicht tun sollten.

TL; DR - Ändern Sie Ihr Skript nicht. Konfigurieren Sie stattdessen Ihren Dateimanager oder finden Sie heraus, warum Ihre Benutzer ihn versehentlich ausführen.

BEARBEITEN: Sie scheinen Ihr Skript als etwas Besonderes zu behandeln, als ob die allgemeinen Einstellungen nicht gut genug wären und Ihr Skript eine spezielle Bestätigung des Benutzers benötigt. Ein Doppelklick darauf ist die Bestätigung. Wenn Sie feststellen, dass Ihre Benutzer es versehentlich ausführen, müssen Sie herausfinden, warum sie es tun, und das stattdessen lösen. Dann besteht Ihr eigentliches Problem nicht darin , eine Bestätigung zu verlangen, sondern zu verhindern, dass Ihre Benutzer sie versehentlich ausführen.

Aus der Art und Weise, wie Sie Ihr Problem aufdecken, geht hervor, dass Sie erwarten, dass Ihr Programm (Skript) ausgeführt wird, indem Sie zu dem Speicherort der Datei navigieren und dann im Dateimanager darauf klicken. Denken Sie an alle anderen Programme in Ihrem System. Wie viele fängst du so an? Navigieren Sie zu, /usr/local/binwenn Sie Firefox starten? Natürlich nicht. Sie klicken im Anwendungsmenü darauf. (Gnome Tweak ist ein Python-Skript, vielleicht ist das ein besseres Beispiel)

Hoffentlich werden Sie das Klicken im Anwendungsmenü nicht als Unfall betrachten. Ihr Problem besteht also darin, wie Sie Ihr Skript dort anzeigen lassen, anstatt den Dateimanager zu verwenden. Dazu tun Sie Folgendes:

  1. Platzieren Sie Ihr Skript nicht in der Nähe der anderen Dateien, in denen der Benutzer möglicherweise versehentlich darauf klickt (der typische Ort ist /usr/local/bin/eine systemweite Installation oder ~/.local/bin/eine Benutzerinstallation).

  2. Erstellen Sie eine Desktop-Eintragsdatei (lesen Sie die Standardspezifikationen ). Hier ist ein minimaler Fall:

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

    und schiebe es in /usr/local/share/applications/your-script.xmloder ~/.local/share/your-script.xml.

  3. Zum Schluss laufen update-desktop-database.


Da Sie auf das Skript doppelklicken, ist es Aufgabe Ihres Dateimanagers, dies zu bestätigen. Es ist nicht die Aufgabe des Skripts, zu bestätigen, ob es ausgeführt werden soll. Nehmen Sie das bis zum Äußersten. Können Sie sich vorstellen, wie lächerlich es wäre, wenn Sie jedes Mal, wenn Sie ein Programm aufrufen, dies bestätigen müssten?

Das einzige Mal, wenn ein Programm um Bestätigung bitten sollte, ist, wenn es etwas möglicherweise Gefährliches und Irreversibles tun will. Zum Beispiel das Überschreiben einer Datei oder das Umgehen des Papierkorbs. Beachten Sie auch, dass es in diesen Beispielen darum geht, ein Programm dazu zu bringen, etwas Bestimmtes zu tun. Es geht nicht darum, solche Programme zu starten. Wenn ein Programm nur dazu dient, so gefährliche Dinge zu tun, sollte es auch keine Bestätigung verlangen.

In der Tat werden Sie von Nautilus (Gnome-Dateimanager) bereits standardmäßig aufgefordert, zu bestätigen, ob Sie ein Skript ausführen möchten (oder es einfach in einem Texteditor öffnen möchten).

Nautilus-Bestätigungsdialog

Und natürlich ist dieses Verhalten konfigurierbar, sodass der Benutzer es deaktivieren kann (Notizeintrag in ausführbaren Textdateien ).

Nautilus-Einstellungsmenü - Registerkarte Verhalten

Fügen Sie Ihrem Skript also keinen nervigen Bestätigungsdialog hinzu. Konfigurieren Sie Ihren Dateimanager richtig. Und lassen Sie Ihre Benutzer dasselbe tun.

Carandraug
quelle
1
Dies ist keine wirkliche Lösung, da dies nicht einfach und sicher an andere weitergegeben werden kann.
Ismael Miguel
Danke ... Ich weiß, wie man das macht ... Aber dies fügt allen Skripten eine Bestätigung hinzu ... Ich möchte es für ein bestimmtes Skript ...
Mayank Budhwani
@IsmaelMiguel, aber das ist der springende Punkt der Antwort. Es sollte nicht geteilt werden. Es gibt zwei verschiedene Dinge, die Aktion des Programms und das Systemverhalten / -erlebnis. Sie sollten die beiden nicht zusammenführen.
Carandraug
@IsmaelMiguel Diese Antwort zeigt das Anti-Muster dessen auf, was der Benutzer tun möchte. Es gibt dem Fragenden keinen Fisch, weil er allergisch ist.
Braiam
@mayankbudhwani Sie lösen immer noch das falsche Problem. Warum ist dieses spezielle Skript so besonders? Wenn Ihre Benutzer versehentlich darauf klicken, ist dies ein anderes Problem. Ich habe die Antwort mit einem anderen Ansatz bearbeitet.
Carandraug
2

Sie können yad verwenden, was wie Zenity bei Steroiden ist, da es weitaus konfigurierbarer ist. Sie können es vom Software Center in Ubuntu installieren. In seiner einfachsten Form können Sie eingeben

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

und du solltest das sehen: Screenshot 1

Wenn OK gedrückt wurde, erhalten wir einen Rückkehrcode von 0, wenn Abbrechen gedrückt wurde, erhalten wir einen Rückkehrcode von 1.

Es ist besser, das Feld in der Mitte zu platzieren und auch die Breite anzupassen. Verwenden Sie eine führende Registerkarte, um den Text "Sind Sie sicher?" Zu positionieren. mehr nach rechts und auch immer oben. Dafür brauchen wir:

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

Die meisten Schalter sind selbsterklärend, mit Ausnahme des "\ t" vor dem "Sind Sie sicher?" Dadurch wird einfach ein Tabulator hinzugefügt, bevor der Text gedruckt wird. Jetzt sollten wir das sehen:Geben Sie hier die Bildbeschreibung ein

Die Box ist zentriert, immer oben und sieht besser aus. Verwenden Sie Folgendes, um eine Variable festzulegen, um zu testen, für welche Taste gedrückt wurde:

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

In diesem Beispiel verwenden wir die Variable $ result, die auf 0 gesetzt wird, wenn OK gedrückt wurde, oder auf 1, wenn Abbrechen gedrückt wurde.

Für Hilfe bei yad können Sie verwenden man yadoder yad --help-allich fand praktische Beispiele einfacher anzupassen. Es gibt einige hier . yad ist meiner Meinung nach viel konfigurierbarer und daher benutzerfreundlicher als Zenity.

Scooby-2
quelle
Für den Fall, dass es jemandem hilft, den ich schon einmal benutzt habe. Sie können es hier sehen: askubuntu.com/questions/488350/…
Scooby-2