Minta konfirmasi pengguna sebelum menjalankan skrip?

8

Apakah ada cara untuk mendapatkan kotak dialog ketik Konfirmasi Pengguna (Seperti Apakah Anda Yakin / Ya) ketika saya menjalankan skrip (dengan klik dua kali)? Maksud saya bukan di Terminal, tetapi kotak konfirmasi grafis, sesuatu seperti ini: masukkan deskripsi gambar di sini

(Saya tahu gambar itu dari windows, saya tidak bisa menemukan yang Linux)

mayank budhwani
sumber

Jawaban:

13

Ada cara menggunakan zenity

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

masukkan deskripsi gambar di sini

Anda dapat menguji status keluar dari perintah dengan $?variabel, sesuatu seperti ini: if [ $? -eq 1 ];then exit 1 ; fi. 0adalah OK, 1dibatalkan. Konstruk ini akan berfungsi dengan baik jika Anda perlu menguji status keluar dari popup nanti, mungkin menyimpan $?tepat setelah popup keluar ke suatu variabel. Seperti dibahas dalam komentar, struktur seperti di bawah ini juga akan berfungsi:

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

atau

 zenity --question --text "Are you sure?" || echo "User isn't sure:/"
Sergiy Kolodyazhnyy
sumber
2
Anda tidak perlu tanda kurung siku. Lakukan if zenity...atauzenity... || exit
Kevin
Dapat dilakukan dengan cara itu, tetapi saya lebih suka gaya yang lebih "tradisional"
Sergiy Kolodyazhnyy
2
Sepertinya konyol bagi saya untuk menguji status keluar suatu program dengan ... memasukkan status keluarnya ke program lain (atau shell builtin) dan kemudian menguji status keluar dari itu.
Kevin
Agak konyol, tapi itu menjadi kekuatan kebiasaan
Sergiy Kolodyazhnyy
6

Anda bisa menggunakan xmessageskrip itu sendiri. Letakkan sesuatu seperti ini setelah "shebang":

xmessage "Are you sure?"

Ini akan menampilkan pesan grafis yang mengatakan "Anda yakin?" dengan tombol "oke".

Anda dapat mengonfigurasi xmessageuntuk memiliki lebih dari satu tombol dan mengubah apa yang tertulis di dalamnya. Anda juga dapat mengonfigurasi tindakan yang dilakukan oleh setiap tombol.

Sebagai contoh,

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

Lihat man xmessagesemua opsi (ada banyak).

Eduardo Cola
sumber
Terima kasih ... Solusi ini juga berfungsi dengan baik .. Hanya saja zenity menampilkan dialog yang terlihat lebih baik .. Dari segi fungsionalitas, keduanya berfungsi ...
mayank budhwani
5

Alih-alih memberi tahu Anda cara melakukannya, saya akan memberi tahu Anda bahwa Anda seharusnya tidak melakukan itu.

TL; DR - Jangan ubah skrip Anda. Alih-alih mengkonfigurasi pengelola file Anda atau mencari tahu mengapa pengguna Anda menjalankannya secara tidak sengaja.

EDIT: Tampaknya Anda memperlakukan skrip Anda sebagai sesuatu yang istimewa, seolah-olah pengaturan umum tidak cukup baik dan skrip Anda memerlukan konfirmasi khusus dari pengguna. Mengklik dua kali itu adalah konfirmasi. Jika Anda menemukan bahwa pengguna Anda menjalankannya secara tidak sengaja maka Anda harus mencari tahu mengapa mereka melakukannya dan menyelesaikannya. Maka masalah Anda yang sebenarnya bukanlah bagaimana cara meminta konfirmasi tetapi bagaimana mencegah pengguna Anda menjalankannya secara tidak sengaja.

Dari cara Anda mengekspos masalah Anda, tampaknya Anda mengharapkan program (skrip) Anda dijalankan dengan menavigasi ke tempat file itu, dan kemudian mengkliknya dari manajer file. Pikirkan semua program lain di sistem Anda. Berapa banyak yang Anda mulai seperti itu? Apakah Anda menavigasi ke /usr/local/binsaat memulai firefox? Tentu saja tidak. Anda mengkliknya dari menu aplikasi. (Tweak gnome adalah skrip python mungkin itu contoh yang lebih baik)

Semoga Anda tidak akan mempertimbangkan mengkliknya dari menu aplikasi kecelakaan. Jadi masalah Anda adalah bagaimana membuat skrip Anda muncul di sana daripada menggunakan file manager. Untuk melakukan ini, Anda melakukan hal-hal berikut:

  1. letakkan skrip Anda dari file lain di mana pengguna dapat mengkliknya secara tidak sengaja (tempat tipikal adalah /usr/local/bin/untuk instalasi seluruh sistem atau ~/.local/bin/untuk instalasi pengguna)

  2. buat file Entri Desktop (baca spesifikasi standar ). Ini kasus minimal:

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

    dan masukkan /usr/local/share/applications/your-script.xmlatau ~/.local/share/your-script.xml.

  3. Akhirnya lari update-desktop-database.


Karena Anda mengklik dua kali pada skrip, itu tugas manajer file Anda untuk mengonfirmasi ini. Bukan tugas skrip untuk mengonfirmasi apakah skrip harus dijalankan. Ambil ini secara ekstrim. Bisakah Anda bayangkan betapa konyolnya setiap kali Anda menelepon suatu program yang harus Anda konfirmasikan?

Satu-satunya waktu ketika sebuah program harus meminta konfirmasi adalah ketika itu akan melakukan sesuatu yang mungkin berbahaya dan tidak dapat diubah. Misalnya, menimpa file atau melewati tempat sampah. Dan perhatikan bahwa bahkan contoh-contoh ini adalah tentang membuat program melakukan sesuatu yang spesifik. Mereka bukan tentang memulai program semacam itu. Jika suatu program hanya bertujuan untuk melakukan hal berbahaya seperti itu, maka seharusnya tidak meminta konfirmasi juga.

Memang, Nautilus (pengelola file Gnome) sudah secara default akan meminta Anda untuk mengonfirmasi apakah Anda ingin menjalankan skrip (atau cukup membukanya di editor teks).

Dialog konfirmasi Nautilus

Dan tentu saja, perilaku ini dapat dikonfigurasi, memberikan pengguna kemungkinan untuk mematikannya (entri catatan pada File Teks yang Dapat Dieksekusi ).

Menu preferensi Nautilus - tab perilaku

Jadi, jangan tambahkan dialog konfirmasi yang mengganggu ke skrip Anda. Konfigurasikan manajer file Anda dengan benar. Dan biarkan pengguna Anda melakukan hal yang sama.

carandraug
sumber
1
Ini sebenarnya bukan solusi, karena ini tidak dapat dengan mudah dan aman dibagikan kepada orang lain.
Ismael Miguel
Terima kasih ... Saya tahu bagaimana melakukan itu .. Tapi ini menambahkan konfirmasi untuk semua scipts ... Saya ingin itu untuk skrip tertentu ...
mayank budhwani
@ IsmaelMiguel tapi itulah inti dari jawabannya. Seharusnya tidak dibagikan. Ada dua hal yang berbeda, aksi program dan perilaku sistem / pengalaman. Anda seharusnya tidak menggabungkan keduanya.
carandraug
@IsmaelMiguel jawaban ini menunjukkan anti-pola dari apa yang ingin dilakukan pengguna. Itu tidak memberikan ikan kepada penanya karena dia alergi.
Braiam
@mayankbudhwani Anda masih menyelesaikan masalah yang salah. Mengapa skrip khusus itu istimewa? Jika pengguna Anda mengkliknya secara tidak sengaja, itu masalah yang berbeda. Saya telah mengedit jawaban dengan pendekatan lain.
carandraug
2

Anda dapat menggunakan yad, yang seperti zenity pada steroid karena jauh lebih mudah dikonfigurasi. Anda dapat menginstalnya dari Pusat Perangkat Lunak di Ubuntu. Dalam bentuk paling dasar, Anda bisa mengetik

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

dan Anda akan melihat ini: tangkapan layar 1

Jika OK ditekan kita mendapat kode balik 0, jika Batal ditekan kita mendapat kode balik 1.

Akan lebih baik untuk meletakkan kotak di tengah dan juga menyesuaikan lebarnya, gunakan tab terkemuka untuk memposisikan teks "Apakah Anda yakin?" lebih ke kanan dan juga selalu ada di atas. Untuk ini kita perlu:

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

Sebagian besar sakelar cukup jelas kecuali untuk "\ t" sebelum "Apakah Anda yakin?" yang hanya menambahkan ruang tab sebelum mencetak teks. Sekarang kita harus melihat ini:masukkan deskripsi gambar di sini

Kotak berada di tengah, selalu di atas dan terlihat lebih baik. Untuk mengatur variabel untuk menguji tombol mana yang ditekan, gunakan:

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

Dalam contoh ini kita menggunakan variabel $ hasil yang akan ditetapkan ke 0 jika OK ditekan atau ke 1 jika Batal ditekan.

Untuk bantuan dengan yad, Anda dapat menggunakan man yadatau yad --help-alltetapi saya menemukan contoh praktis lebih mudah untuk beradaptasi. Ada beberapa disini . Yad jauh lebih dapat dikonfigurasi dan karena itu lebih bermanfaat daripada zenity menurut saya.

Scooby-2
sumber
Dalam hal ini membantu siapa pun saya memposting penggunaan yad sekali sebelumnya. Anda dapat melihatnya di sini: askubuntu.com/questions/488350/…
Scooby-2