Whiptail ile Bash Scriptlerde Kullanıcı Arayüzü Oluşturma

Burak

Forum Üyesi
Katılım
18 Temmuz 2026
Mesajlar
18
Konum
Ankara
İşletim Sistemi
Shell script yazarken en sıkıcı işlerden biri kullanıcıyla etkileşime girmek. read komutuyla soru sormak falan iş görüyor ama çirkin ve sınırlı. Whiptail tam bu noktada devreye giriyor; terminal içinde çalışan, basit ve temiz bir arayüz sunuyor. dialog'un biraz daha hafif kuzeni gibi düşünebilirsiniz.

Genelde apt/deb gibi paketleme araçlarının arka planda kullandığını görürsünüz ama kendi scriptlerinizde de kullanmak çok kolay. Ben sunucu kurulum otomasyonlarında veya yedekleme scriptlerinde kullanıcıdan onay almak ya da birkaç seçenek sunmak için sıkça başvuruyorum.

En basit haliyle bir onay kutusu şöyle:
Kod:
if whiptail --title "Devam" --yesno "İşleme devam edilsin mi?" 10 60; then
    echo "Tamamlandı."
else
    echo "İptal."
fi

Burada 10 60 kısmı pencere boyutu (yükseklik, genişlik). --yesno dışında --msgbox, --inputbox, --passwordbox ve ileri düzey için --checklist veya --radiolist var. Mesela birden fazla paket seçtirmek istediğimde --checklist kullanıyorum:

Kod:
CHOICES=$(whiptail --title "Paket Seçimi" --checklist \
"Yüklenecek paketleri seçin:" 15 50 4 \
"nginx" "Web Sunucusu" OFF \
"mysql" "Veritabanı" OFF \
"php" "PHP Dili" OFF \
"nodejs" "Node.js" OFF 3>&1 1>&2 2>&3)

Dikkat edilmesi gereken en kritik nokta sondaki 3>&1 1>&2 2>&3 yönlendirmesi. Whiptail çıktıyı stdout yerine stderr'e yazdığı için bu yönlendirme olmadan değişkene atama yapamazsınız, boş döner. İlk başta can sıkıcı gelebilir ama alışınca otomatik yazıyorsunuz.

Seçilen değerler boşluklu ve tırnak içinde döndüğü için echo $CHOICES yapınca "Option1" "Option2" gibi göreceksiniz. Bunu döngüde işlemek için for veya eval kullanılabilir.

Bir de progress bar olayı var ki uzun işlemler için birebir. --gauge ile yüzdeyi güncelleyerek ilerlemeyi gösteriyorsunuz:

Kod:
{
    for ((i=0; i<=100; i+=10)); do
        sleep 0.5
        echo $i
    done
} | whiptail --title "Yedekleniyor" --gauge "Lütfen bekleyin..." 8 50 0

Burada döngüden gelen sayıları pipe ile whiptail'e aktarıyoruz. 0 başlangıç yüzdesi. Eğer gerçek bir işlem yapıyorsanız, rsync gibi bir komutun çıktısını yakalayıp yüzdeyi hesaplamanız gerekebilir.

Kurulum olarak zaten çoğu dağıtımda varsayılan gelir, yoksa apt install whiptail veya yum install newt (newt paketi içinde gelir) ile hallediliyor. Ben genelde scriptlerin başına command -v whiptail >/dev/null 2>&1 || { echo "Whiptail yüklü değil."; exit 1; } kontrolü ekliyorum, yoksa yarıda patlayınca saçma sapan hatalar çıkıyor.
 
Geri
En Üst