GNU/Linux >> Belajar Linux >  >> Linux

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

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

Tidak setiap skrip yang Anda tulis membutuhkan 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 newt perpustakaan pemrograman. Whiptail menawarkan kotak dialog yang berbeda untuk tujuan yang berbeda. Bergantung pada kasus penggunaan Anda, Anda dapat menggunakan kotak dialog ini untuk membuat skrip Anda lebih interaktif.

Instal 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 terinstal, 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 pacman -S whiptail

Alpine Linux:

$ apk add newt

Opsi Bantuan

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 kami akan membahas semuanya di bagian mendatang.

$ whiptail -help
Box options: 
    --msgbox <text> <height> <width>
    --yesno  <text> <height> <width>
    --infobox <text> <height> <width>
    --inputbox <text> <height> <width> [init] 
    --passwordbox <text> <height> <width> [init] 
    --textbox <file> <height> <width>
    --menu <text> <height> <width> <listheight> [tag item] ...
    --checklist <text> <height> <width> <listheight> [tag item status]...
    --radiolist <text> <height> <width> <listheight> [tag item status]...
    --gauge <text> <height> <width> <percent>

1. Kotak Pesan

Kotak pesan akan menampilkan pesan kepada pengguna dan tunggu hingga pengguna menekan atau kunci. Saat Anda menekan itu akan melempar kode kembali 0 dan jika Anda menekan itu akan membuang kode kembali 255 .

$ whiptail --title "Welcome Message" --msgbox "Howdy, Welcome to OSTechnix.." 8 78

Mari kita decode perintah di atas.

--title  Ini akan menambahkan judul ke jendela  
--msgbox   Ini akan mencetak pesan yang Anda berikan dalam tanda kutip.
8 78   Ini mengatur Tinggi(8) dan Lebar(78) dari jendela.

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

$ ps -ef | grep -i whiptail 
karthick   20023    9251  0 22:41 pts/0    00:00:00 whiptail --title Welcome Message --msgbox Howdy, Welcome to 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: Negara Bagian (S ) -> gangguan tidur (menunggu acara selesai).

2. Kotak Info

Info mirip dengan kotak pesan tetapi perbedaannya tidak seperti kotak pesan, kotak info tidak akan menunggu input pengguna. Gunakan –-infobox tandai dan berikan string sebagai argumen yang akan ditampilkan di kotak info.

Di beberapa shell, kotak info akan berjalan tetapi tidak akan menampilkan hasil apa pun. Anda harus mengubah emulasi terminal dan menjalankannya seperti yang saya lakukan pada cuplikan di bawah ini.

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

3. Kotak Ya/Tidak

Ya/Tidak Kotak akan menampilkan kotak dialog dengan YA atau TIDAK opsi di mana jika Anda memilih itu akan membuang kembali kode 0 dan saat Anda menekan itu akan membuang kode kembali 1 .

Gunakan --yesno bendera 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, dan jalankan.

#!/usr/bin/env bash

whiptail --title "CONFIRMATION" --yesno "Should I proceed" 8 78 
if [[ $? -eq 0 ]]; then 
  whiptail --title "MESSAGE" --msgbox "Process completed successfully." 8 78 
elif [[ $? -eq 1 ]]; then 
  whiptail --title "MESSAGE" --msgbox "Cancelling Process since user pressed <NO>." 8 78 
elif [[ $? -eq 255 ]]; then 
  whiptail --title "MESSAGE" --msgbox "User pressed ESC. Exiting the script" 8 78 
fi 

Jika Anda tidak tahu tentang pernyataan kondisional bash, lihat artikel singkat kami tentang hal yang sama menggunakan tautan di bawah ini.

  • Skrip Bash – Pernyataan Bersyarat

4. Kotak Teks

Kotak teks akan membaca dan mencetak file. Dalam cuplikan di bawah ini saya membaca ostechnix.txt mengajukan. Bendera –scrolltext memungkinkan Anda untuk 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. Pengalihan

Kotak dialog yang akan Anda lihat di bagian yang akan datang 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 disimpan dalam variabel.

Anda harus menggunakan ekspresi berikut untuk menukar stdout dan stderr.

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

Mari kita coba memahami ungkapan di atas. Anda tahu FD1 adalah keluaran 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 deskriptor file 2.
  • 2>&3 - Apa pun yang dikirim ke deskriptor file 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

Dengan 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 "Choose a strong password"

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

Anda perlu menangkap kata sandi ke dalam variabel kemudian menggunakannya dalam skrip. Seperti yang dibahas di bagian Pengalihan, Anda harus mengarahkan ulang hasilnya.

$ PASSWORD=$(whiptail --title "SET PASSWORD" --passwordbox "Choose a strong password" 8 78 3>&1 1>&2 2>&3)
$ echo "The password entered by the user is $PASSWORD"

7. Kotak Masukan

Kotak dialog input 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 mengatur teks input 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 <text> <height> <width> [init]

Contoh:

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 Daftar Periksa

Daftar periksa memungkinkan Anda membuat daftar opsi yang dapat dipilih pengguna.

--checklist <text> <height> <width> <listheight> [tag item status]...

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

Opsi <listheight> menentukan berapa banyak daftar yang akan Anda buat. Setiap daftar akan diberi tag dengan <status> 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 \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" 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 pilihan.

SELECTED=($(whiptail --title "SELECT PACKAGES TO INSTALL" --checklist \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" ON 3>&1 1>&2 2>&3))
$ echo ${SELECTED[@]} # Array of values

Contoh keluaran:

"pip3" "ksnip" "virtualbox"

Jika Anda tidak tahu tentang bash array, kami memiliki artikel terperinci tentang bash array. Saya sarankan Anda melihat tautan di bawah ini.

  • Bash Scripting - Array Terindeks Dijelaskan Dengan Contoh

9. Kotak Dialog Daftar Radio

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

--radiolist <text> <height> <width> <listheight> [tag item status]...

Contoh:

SELECTED=$(whiptail --title "Choose Only One Package" --radiolist \
"List of packages" 20 100 10 \
"chrome" "browser" OFF \
"pip3" "Python package manager" OFF \
"ksnip" "Screenshot tool" OFF \
"virtualbox" "virtualization software" OFF 3>&1 1>&2 2>&3)
$ echo $SELECTED
virtualbox

10. Kotak Dialog Menu

Kotak dialog menu 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. Tapi di kotak dialog menu, yang harus Anda lakukan hanyalah menekan enter yang akan mengembalikan nama tag ke 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 <text> <height> <width> <listheight> [tag item]

Contoh:

TO_RUN=$(whiptail --title "Menu example" --menu "Choose an option" 25 78 5 \
"backup" "Start taking defined backup" \
"restore" "restore from last backup" \
"Schedule" "Display active backup schedules" 3>&1 1>&2 2>&3)
$ echo $TO_RUN 
backup

11. Bilah Kemajuan

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

--gauge <text> <height> <width> <percent>

Persentase kemajuan akan dikendalikan 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 ]]; do
  sleep 1
  COUNTER=$(($COUNTER+10))
  echo ${COUNTER} 
done | whiptail --gauge "Running Data Loader" 6 50 ${COUNTER}

Bilah kemajuan akan bertambah dalam hitungan 10.

Kesimpulan

Kami 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.


Linux
  1. Cara Membuat Thread di Linux (Dengan Program Contoh C)

  2. Cara Membuat Sistem File ZFS dengan Kompresi File di Linux

  3. Cara membuat lonjakan CPU dengan perintah bash

  1. Bagaimana cara membuat file dengan ukuran tertentu di Linux?

  2. Bagaimana Anda membuat jendela di Linux dengan C++?

  3. Bagaimana Linux menangani skrip shell?

  1. Cara membuat server file pribadi dengan SSH di Linux

  2. Cara Membuat Partisi Disk dengan Perintah Parted di Linux

  3. Cara Membuat Backup dengan Perintah tar di Linux