Shell script yazarken en sıkıcı işlerden biri kullanıcıyla etkileşime girmek.
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:
Burada
Dikkat edilmesi gereken en kritik nokta sondaki
Seçilen değerler boşluklu ve tırnak içinde döndüğü için
Bir de progress bar olayı var ki uzun işlemler için birebir.
Burada döngüden gelen sayıları pipe ile whiptail'e aktarıyoruz.
Kurulum olarak zaten çoğu dağıtımda varsayılan gelir, yoksa
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.