Cara Membuat Kotak Dialog GUI Dalam Skrip Bash Dengan Whiptail Di Linux

A beberapa waktu lalu, kami membahas secara singkat tentang Zenity, sebuah program sederhana yang memungkinkan Anda membuat kotak dialog grafis (GTK+) dalam skrip baris perintah dan skrip shell. Pada artikel ini, kita akan membahas utilitas GUI lain yang disebut Whiptail yang dapat digunakan untuk membuat kotak dialog GUI di skrip Bash di Linux.

Tidak setiap skrip yang Anda tulis memerlukan antarmuka grafis frontend. Namun terkadang akan lebih baik jika Anda membuat antarmuka grafis daripada mengandalkan interaksi dengan baris perintah. Dalam kasus saya, jika ada daftar panjang tanggapan yang diperlukan dalam skrip, saya akan memilih untuk menggunakan antarmuka grafis.

Whiptail adalah utilitas GUI ramah yang menggunakan perpustakaan pemrograman baru. Whiptail menawarkan kotak dialog yang berbeda untuk tujuan yang berbeda. Tergantung pada kasus penggunaan Anda, Anda dapat menggunakan kotak dialog ini untuk membuat skrip Anda lebih interaktif.
Contents
Install Whiptail di LinuxHelp Option1. Kotak Pesan2. Kotak Informasi3. Ya/Tidak Kotak4. Kotak Teks5. Pengalihan6. Kotak Kata Sandi7. Kotak Masukan8. Kotak Dialog Daftar Periksa9. Kotak Dialog Daftar Radio10. Kotak Dialog Menu11. Progress BarConclusionInstall Whiptail di Linux

Whiptail sudah diinstal sebelumnya dengan banyak distribusi tetapi jika distribusi Anda tidak menginstal whiptail ikuti petunjuk di bawah untuk menginstalnya.

Untuk memeriksa apakah whiptail sudah diinstal jalankan perintah berikut.

$ which whiptail

Untuk menginstal Whiptail di Debian/Ubuntu dan distribusi turunannya, jalankan perintah berikut:

$ sudo apt install whiptail -y

Fedora/RHEL/CnetOS/AlmaLinux/Rocky Linux:

$ sudo dnf install newt

Arch Linux, EndeavourOS, Manjaro Linux:

$ sudo sudo 
$ apk add newt

Help Option

Anda dapat menggunakan --help flag yang akan menampilkan daftar kotak dialog yang didukung dan opsi lain yang dapat Anda gunakan. Secara total, ada 10 kotak dialog yang didukung dengan berbagai fungsi dan kita akan melihat semuanya di bagian yang akan datang.

$ whiptail -help Opsi kotak: --msgbox --yesno --infobox --inputbox [init] -- passwordbox [init] --textbox --menu [item tag] ... --checklist [status item tag]... --radiolist [status item tag]... --gauge 

1. Kotak Pesan

Kotak pesan akan menampilkan pesan kepada pengguna dan menunggu hingga pengguna menekan atau menekan tombol. Ketika Anda menekannya akan mengeluarkan kode pengembalian 0 dan jika Anda menekannya akan mengeluarkan kode pengembalian 255.

$ whiptail --title "Pesan Selamat Datang" --msgbox "Halo, Selamat Datang di OSTechnix.." 8 78

Mari kita decode perintah di atas.

Anda dapat membuka terminal baru dan memeriksa proses whiptail. Ini akan dalam keadaan tidur. Artinya - menunggu Anda untuk menekan atau .

$ ps -ef | grep -i whiptail karthick 20023 9251 0 22:41 pts/0 00:00:00 whiptail --title Pesan Selamat Datang --msgbox Halo, Selamat datang di OSTechnix.. 8 78 karthick 20071 19379 0 22:41 pts/1 00:00 :00 grep --color=auto -i whiptail 
$ ps -q 20023 -o state --no-headers S 

CATATAN: State (S) -> interruptible sleep (menunggu acara selesai).
2. Info Box

Info mirip dengan kotak pesan tapi bedanya kotak pesan tidak seperti kotak info yang tidak akan menunggu inputan pengguna. Gunakan flag –-infobox dan berikan string sebagai argumen yang akan ditampilkan di kotak info.

Dalam beberapa shell, kotak info akan berjalan tetapi tidak akan menampilkan hasil apa pun. Anda harus mengubah emulasi terminal dan menjalankannya seperti yang saya lakukan di snippet.

$ di bawah ini TERM=ansi whiptail --title "Welcome Message" --infobox "Howdy, Welcome to OSTechnix.." 8 78 

3. Ya/Tidak Box

Yes/No Kotak akan menampilkan kotak dialog dengan opsi YA atau TIDAK di mana jika Anda memilihnya akan membuang kode pengembalian 0 dan ketika Anda menekannya akan mengeluarkan kode pengembalian 1.

Use --yesno flag untuk meminta pilihan. Jalankan cuplikan berikut yang menggabungkan kotak ya/tidak dan kotak pesan. Pada awalnya, itu akan menampilkan opsi Ya/Tidak, dan tergantung pada pilihan Anda itu akan membuang kode kembali.

Buat skrip shell, salin cuplikan di bawah ini, dan jalankan.

#!/usr/bin/env bash whiptail - -judul "KONFIRMASI" --yesno "Haruskah saya melanjutkan" 8 78 jika [[ $? -persamaan 0 ]]; lalu whiptail --title "MESSAGE" --msgbox "Proses berhasil diselesaikan." 8 78 elif [[ $? -persamaan 1 ]]; lalu whiptail --title "MESSAGE" --msgbox "Membatalkan Proses sejak pengguna menekan ." 8 78 elif [[ $? -persamaan 255 ]]; kemudian whiptail --title "MESSAGE" --msgbox "User menekan ESC. Keluar dari skrip" 8 78 fi 

Jika Anda tidak tahu tentang pernyataan kondisional bash, lihat artikel singkat kami tentang hal yang sama menggunakan tautan di bawah ini.
Bash Scripting – Pernyataan Bersyarat4. Text Box

Kotak teks akan membaca dan mencetak file. Dalam cuplikan di bawah ini saya membaca file ostechnix.txt. Bendera –scrolltext memungkinkan Anda menggunakan roda mouse untuk menggulir secara vertikal ketika Anda memiliki halaman teks yang panjang yang tidak sesuai dengan jendela saat ini.

$ whiptail --textbox --scrolltext ostechnix.txt 10 80

5. Redirections

Kotak dialog yang akan Anda lihat di bagian berikutnya memerlukan output untuk disimpan dalam variabel dan kemudian digunakan untuk pemrosesan. Nilai kembalian dari widget dikirim ke stderr, bukan stdout. Jadi anda harus menukar stdout dan stderr agar hasilnya tersimpan di variabel.

Anda harus menggunakan ekspresi berikut untuk menukar stdout dan stderr.

3>&1 1>&2 2>&3

Mari kita coba memahami ekspresi di atas. Anda tahu FD1 adalah output standar dan FD2 adalah kesalahan standar.
3>&1 - Apa pun yang diarahkan ke deskriptor file 3 diarahkan ke deskriptor file 1.1>&2 - Apa pun yang dikirim ke deskriptor file 1(Stdout) dialihkan ke file descriptor 2.2>&3 - Apa pun yang dikirim ke file descriptor 2(stderr) dialihkan ke deskriptor file 3.
Dengan cara ini kita menukar stdout dan stderr sehingga variabel dapat menyimpan nilai kembalian dari kotak dialog.
6. Kotak Kata Sandi

Menggunakan kotak dialog kata sandi, Anda dapat mengetik kata sandi yang tidak akan ditampilkan sebagai teks biasa saat Anda mengetik. Gunakan --passwordbox untuk meminta memasukkan kata sandi.

$ whiptail --title "SET PASSWORD" --passwordbox "Pilih kata sandi yang kuat"

Ketika Anda menekan , itu akan membuang kode pengembalian 0 dan akan mengembalikan kata sandi yang Anda ketikkan ke console (stderr) jika Anda menjalankan dari terminal.

Anda perlu memasukkan kata sandi ke dalam variabel kemudian menggunakannya dalam skrip. Seperti yang dibahas di bagian Redirection, Anda harus mengarahkan result.

$ PASSWORD=$(whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password" 8 78 3>&1 1>&2 2>&3) $ echo "Kata sandi yang dimasukkan oleh pengguna adalah $PASSWORD"

7. Input Box

Input kotak dialog akan meminta pengguna untuk memberikan input. Seperti kotak dialog kata sandi, input yang Anda berikan akan dicetak ke terminal jika Anda menjalankannya dari terminal. Anda harus menggunakan pengalihan dan menyimpan nilainya ke variabel kemudian digunakan untuk pemrosesan sesuai dengan logika program Anda.

NEW_USER=$(whiptail --title "Create New User" --inputbox "Username to be Created" 8 40 3> &1 1>&2 2>&3)

Anda juga dapat menyetel teks masukan default. Yang harus Anda lakukan adalah menambahkan teks setelah tinggi dan lebar. Di bawah ini adalah sintaks di mana alih-alih [init] Anda akan menempatkan teks default.

--inputbox [init]

Example:

whiptail --title "Create New User" --inputbox "Username to be Created" 8 40 noname

Sekarang mari kita gabungkan kotak input, kotak kata sandi, Kotak Ya/Tidak dan Kotak Teks dan tulis program pembuatan pengguna sederhana untuk melihat bagaimana kotak dialog ini dapat digabungkan bersama.
8. Kotak Dialog Checklist

Checklist memungkinkan Anda membuat daftar opsi yang dapat dipilih pengguna.

--checklist [status item tag]...

Di atas adalah sintaks untuk membuat kotak dialog daftar centang. Anda harus menggunakan flag --checklist diikuti dengan mengatur tinggi dan lebar kotak dialog.

Opsi menentukan berapa banyak daftar yang akan Anda buat. Setiap daftar akan ditandai dengan yang diatur ke ON atau OFF. Pada poin ke daftar yang dipilih dan Off poin ke tidak ada pilihan daftar.

$ whiptail --title "SELECT PACKAGES TO INSTALL" --checklist  "Daftar paket" 20 100 10  "chrome" "browser" OFF  "pip3" "Python package manager" MATI  "ksnip" "Alat tangkapan layar" MATI  "virtualbox" "perangkat lunak virtualisasi" ON

Untuk memilih daftar tekan spasi dan gunakan panah atas dan bawah untuk berpindah di antara daftar. Setelah selesai tekan enter.

Anda dapat menyimpan output ke array dan kemudian menggunakannya. Nama tag ("Chrome, pip3, ksnip, virtualbox") akan dicetak sebagai output ke stderr berdasarkan selection.

SELECTED=($(whiptail --title "SELECT PACKAGES TO INSTALL" --checklist  "List of packages" 20 100 10  "chrome" "browser" MATI  "pip3" "Python package manager" MATI  "ksnip" "Alat tangkapan layar" MATI  "virtualbox" "perangkat lunak virtualisasi" HIDUP 3>&1 1>&2 2>&3)) 

$ echo ${SELECTED[@]} # Array nilai

Contoh output:

"pip3" "ksnip" "virtualbox"

Jika Anda tidak tahu tentang array bash, kami memiliki artikel terperinci tentang array bash. Saya sarankan Anda melihat tautan di bawah ini. Skrip
Bash – Array Terindeks Dijelaskan Dengan Contoh9. Kotak Dialog Daftar Radio

Kotak dialog daftar radio mirip dengan kotak dialog daftar periksa tetapi satu-satunya perbedaan adalah Anda hanya dapat memilih satu opsi dari daftar. Secara sintaksis, daftar radio dan daftar periksa adalah sama.

--radiolist [status item tag]...

Example:

SELECTED=$(whiptail --title "Choose Only One Package" --radiolist  "List of packages" 20 100 10  "chrome" "browser" MATI  "pip3" "Python package manager" MATI  "ksnip" "Alat tangkapan layar" MATI  "virtualbox" "perangkat lunak virtualisasi" MATI 3>&1 1>&2 2>&3)
$ echo $DIPILIH virtualbox
  1. Kotak Dialog Menu

    Menu kotak dialog mirip dengan kotak dialog tombol radio. Satu-satunya perbedaan yang saya rasakan adalah, di kotak dialog tombol radio Anda harus menekan untuk memilih item dari daftar lalu tekan enter. Tetapi di kotak dialog menu, yang harus Anda lakukan hanyalah menekan enter yang akan mengembalikan nama tag menjadi stderr.

    Sintaksnya mirip dengan daftar periksa dan tombol radio tetapi satu-satunya perbedaan adalah tidak perlunya opsi “status” untuk mengatur ON/OFF di kotak dialog menu.

--menu [item tag]

Example:

TO_RUN=$(whiptail --title "Contoh menu" --menu "Pilih opsi" 25 78 5  "cadangan" "Mulai mengambil cadangan yang ditentukan"  "pulihkan" "pulihkan dari cadangan terakhir"  "Jadwalkan" "Tampilkan jadwal pencadangan aktif" 3>&1 1>&2 2>&3)
$ echo $TO_RUN backup
  1. Progress Bar

    Untuk membuat progress bar Anda harus menggunakan sintaks berikut. Pertama, Anda akan melewati teks yang akan dicetak ketika bilah kemajuan berjalan dan mengatur tinggi dan lebar jendela diikuti dengan persentase kemajuan.

--gauge 

Persentase kemajuan akan dikontrol oleh logika kita. Lihatlah cuplikan di bawah ini. Saya mengarahkan ulang while ke bilah kemajuan dan menambahkan variabel COUNTER dalam 10 hitungan yang akan digunakan sebagai persentase kemajuan.

#!/usr/bin/env bash COUNTER=0 while [[ ${COUNTER} -le 100]]; tidur 1 COUNTER=$(($COUNTER+10)) echo ${COUNTER} selesai | whiptail --gauge "Running Data Loader" 6 50 ${COUNTER}

Progress bar akan bertambah dalam hitungan 10.
Conclusion

Kita telah mencapai akhir artikel ini. Di sini, kita telah melihat secara singkat bagaimana menggunakan Whiptail untuk membuat berbagai kotak dialog dalam skrip bash. Jika Anda telah menggunakan whiptail dan memiliki trik di bawah slave, bagikan dengan kami melalui kotak komentar.

Resource:
Whiptail
Bash scripting guides:
Cara Menggunakan Perintah Tanggal Dalam Skrip Bash Di LinuxCara Men-debug Skrip Bash Di Linux Dan Skrip UnixBash – Parse Argumen Dalam Skrip Bash Menggunakan getoptsCara Membuat Kotak Dialog GUI Dalam Skrip Bash Dengan Zenity Di Linux Dan UnixBash Scripting – Pernyataan KasusBash Scripting – Pernyataan BersyaratBash Scripting – Manipulasi StringBash Scripting – Perintah Printf Dijelaskan Dengan ContohBash Scripting – Array Terindeks Dijelaskan Dengan Contoh-Contoh Bash Scripting Penjelasan Array Dengan ExampleBash Scripting – Untuk Loop Dijelaskan Dengan ExampleBash Scripting – Sementara Dan Sampai Loop Dijelaskan Dengan ExampleBash Redirection Dijelaskan Dengan ExampleBash Scripting – Variabel Dijelaskan Dengan ExampleBash Scripting – Fungsi Dijelaskan Dengan ExampleBash Perintah Echo Dijelaskan Dengan Contoh Di LinuxBash Tutorial Heredoc Untuk pemula