Zapytaj użytkownika o potwierdzenie przed wykonaniem skryptu?

8

Czy istnieje sposób na wyświetlenie okna dialogowego typu Potwierdzenie użytkownika (na przykład Czy jesteś pewien / Tak / Nie) po uruchomieniu skryptu (podwójnym kliknięciem)? Nie mam na myśli Terminala, ale Graficzne okno potwierdzenia, coś takiego: wprowadź opis zdjęcia tutaj

(Wiem, że obraz pochodzi z systemu Windows, nie mogłem znaleźć Linuxa)

mayank budhwani
źródło

Odpowiedzi:

13

Istnieje sposób użycia zenity

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

wprowadź opis zdjęcia tutaj

Można sprawdzić stan wyjścia tego polecenia z $?zmienna, coś takiego: if [ $? -eq 1 ];then exit 1 ; fi. 0jest OK, 1jest anulowane. Ten konstrukt będzie działał dobrze, jeśli będziesz musiał później przetestować status wyjścia wyskakującego okienka, być może zapisz go $?zaraz po wyjściu wyskakującego okienka do zmiennej. Jak omówiono w komentarzach, struktury takie jak poniżej również będą działać:

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

lub

 zenity --question --text "Are you sure?" || echo "User isn't sure:/"
Sergiy Kolodyazhnyy
źródło
2
Nie potrzebujesz nawiasów kwadratowych. Po prostu zrób if zenity...lubzenity... || exit
Kevin,
Można to zrobić w ten sposób, ale wolę bardziej „tradycyjny” styl
Sergiy Kolodyazhnyy
2
Po prostu wydawało mi się głupie testowanie statusu wyjścia programu poprzez ... podawanie jego statusu wyjścia do innego programu (lub wbudowanej powłoki), a następnie testowanie statusu wyjścia tego.
Kevin,
To trochę głupie, ale stało się siłą nawyku
Sergiy Kolodyazhnyy
6

Możesz użyć xmessagew samym skrypcie. Umieść coś takiego po „shebang”:

xmessage "Are you sure?"

Spowoduje to wyświetlenie graficznego komunikatu „Jesteś pewien?” z przyciskiem „OK”.

Możesz skonfigurować, xmessageaby mieć więcej niż jeden przycisk i zmienić to, co jest w nim napisane. Możesz także skonfigurować działania wykonywane za pomocą każdego przycisku.

Na przykład,

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

Sprawdź man xmessagewszystkie opcje (jest ich wiele).

Eduardo Cola
źródło
Dzięki ... To rozwiązanie również działa dobrze. Po prostu zenity wyświetla lepiej wyglądające okno dialogowe. Pod względem funkcjonalności oba działają ...
mayank budhwani
5

Zamiast mówić ci, jak to zrobić, powiem ci, że nie powinieneś tego robić.

TL; DR - Nie zmieniaj skryptu. Zamiast tego skonfiguruj menedżera plików lub dowiedz się, dlaczego użytkownicy go przypadkowo uruchomili.

EDYCJA: Wydaje się, że traktujesz swój skrypt jako coś specjalnego, jakby ogólne ustawienia nie były wystarczająco dobre, a twój skrypt wymaga specjalnego potwierdzenia od użytkownika. Podwójne kliknięcie na nim jest potwierdzenie. Jeśli okaże się, że użytkownicy uruchamiają go przypadkowo, musisz dowiedzieć się, dlaczego to robią, i zamiast tego rozwiązać. Zatem twoim prawdziwym problemem nie jest to, jak wymagać potwierdzenia, ale jak zapobiec przypadkowemu uruchomieniu go przez użytkowników.

Ze sposobu, w jaki ujawniasz swój problem, wydaje się, że oczekujesz uruchomienia programu (skryptu), przechodząc do miejsca, w którym znajduje się plik, a następnie klikając go w menedżerze plików. Pomyśl o wszystkich innych programach w twoim systemie. Ilu tak zaczynasz? Czy nawigujesz /usr/local/binpo uruchomieniu Firefoksa? Oczywiście, że nie. Kliknij na niego z menu aplikacji. (gnome tweak to skrypt w języku Python, może to lepszy przykład)

Mamy nadzieję, że nie pomyślisz o kliknięciu go w menu aplikacji jako wypadku. Twój problem polega na tym, jak sprawić, by skrypt pojawiał się tam zamiast używać menedżera plików. Aby to zrobić, wykonaj następujące czynności:

  1. umieść skrypt z dala od innych plików, w których użytkownik może go przypadkowo kliknąć (typowe miejsce to /usr/local/bin/instalacja systemowa lub instalacja ~/.local/bin/użytkownika)

  2. utwórz plik Entry Desktop Entry (przeczytaj standardowe specyfikacje ). Oto minimalny przypadek:

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

    i wepchnij to w /usr/local/share/applications/your-script.xmllub ~/.local/share/your-script.xml.

  3. Wreszcie biegnij update-desktop-database.


Ponieważ dwukrotnie klikasz skrypt, potwierdzeniem tego jest menedżer plików. Skrypt nie musi potwierdzać, czy powinien zostać uruchomiony. Weź to do końca. Czy potrafisz sobie wyobrazić, jak absurdalne byłoby, gdybyś za każdym razem, gdy wywoływałeś jakiś program, musiał to potwierdzić?

Jedyny moment, w którym program powinien poprosić o potwierdzenie, to moment, w którym ma zamiar zrobić coś potencjalnie niebezpiecznego i nieodwracalnego. Na przykład nadpisanie pliku lub ominięcie kosza. I zauważ, że nawet te przykłady dotyczą zmuszenia programu do zrobienia czegoś konkretnego. Nie dotyczą uruchamiania takich programów. Jeśli jedynym celem programu jest zrobienie tak niebezpiecznej rzeczy, nie powinno to również wymagać potwierdzenia.

Rzeczywiście, Nautilus (menedżer plików Gnome) już domyślnie prosi o potwierdzenie, czy chcesz wykonać skrypt (lub po prostu otworzyć go w edytorze tekstu).

Okno dialogowe potwierdzenia Nautilus

Oczywiście zachowanie to można konfigurować, co daje użytkownikowi możliwość wyłączenia go (wprowadzenie notatek w plikach tekstowych wykonywalnych ).

Menu preferencji Nautilusa - zakładka zachowania

Nie dodawaj irytującego okna dialogowego potwierdzenia do skryptu. Skonfiguruj poprawnie menedżera plików. I pozwól swoim użytkownikom zrobić to samo.

carandraug
źródło
1
To nie jest tak naprawdę rozwiązanie, ponieważ nie można tego łatwo i bezpiecznie udostępnić innym.
Ismael Miguel
Dzięki ... Wiem, jak to zrobić ... Ale to dodaje potwierdzenie wszystkim sciptom ... Chcę tego dla konkretnego skryptu ...
mayank budhwani
@ IsmaelMiguel, ale to jest sedno odpowiedzi. Nie należy go udostępniać. Istnieją dwie różne rzeczy, działanie programu oraz zachowanie / doświadczenie systemu. Nie należy łączyć tych dwóch.
carandraug
@ IsmaelMiguel ta odpowiedź wskazuje na anty-wzorzec tego, co użytkownik chce zrobić. Nie daje ryby pytającemu, ponieważ jest uczulony.
Braiam
@mayankbudhwani nadal rozwiązujesz niewłaściwy problem. Dlaczego ten konkretny skrypt jest wyjątkowy? Jeśli Twoi użytkownicy klikną go przypadkowo, to inny problem. Zredagowałem odpowiedź innym podejściem.
carandraug
2

Możesz użyć yad, który jest jak zenity na sterydach, ponieważ jest o wiele bardziej konfigurowalny. Możesz zainstalować go z Centrum oprogramowania w Ubuntu. W najbardziej podstawowej formie możesz pisać

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

i powinieneś to zobaczyć: zrzut ekranu 1

Jeśli naciśnięto OK, otrzymamy kod powrotu 0, jeśli naciśnięto Anuluj, otrzymamy kod powrotu 1.

Lepiej byłoby umieścić pole na środku, a także dostosować jego szerokość, użyć wiodącej zakładki, aby ustawić tekst „Jesteś pewien?” więcej po prawej, a także mieć go zawsze na wierzchu. W tym celu potrzebujemy:

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

Większość przełączników nie wymaga wyjaśnień, z wyjątkiem „\ t” przed „Jesteś pewien?” który po prostu dodaje spację przed wydrukowaniem tekstu. Teraz powinniśmy to zobaczyć:wprowadź opis zdjęcia tutaj

Pudełko jest wyśrodkowane, zawsze na wierzchu i wygląda lepiej. Aby ustawić zmienną do testowania, dla którego naciśnięto przycisk, użyj:

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

W tym przykładzie używamy zmiennej $ result, która zostanie ustawiona na 0, jeśli naciśnięto OK lub na 1, jeśli naciśnięto Cancel.

Aby uzyskać pomoc Yad można użyć man yadalbo yad --help-allale znalazłem praktyczne przykłady są łatwiejsze do adaptacji. Są tacy tutaj . yad jest znacznie bardziej konfigurowalny i dlatego moim zdaniem bardziej użyteczny niż zenity.

Scooby-2
źródło
Na wypadek, gdyby to pomogło każdemu, kto wcześniej zamieścił użycie yad. Możesz to zobaczyć tutaj: askubuntu.com/questions/488350/...
Scooby-2