| 
 ![[Photo of the Authors]](../../common/images/KatjaAndGuido.jpg)  tarafından  Katja and Guido Socher
 <katja(at)linuxfocusorg, guido(at)linuxfocus.org>
 
 About the authors:
 
 Katja LinuxFocus'un Almanca kısmının editörüdür. Tux'dan, film ve
    fotoğraflardan ve denizden hoşlanır. Katya'nın kişisel sayfasına
    buradan
    ulaşabilirsiniz. Guido uzun zamandır bir Linux hayranıdır çünkü dürüst insanlar
    tarafından tasarlandı ve herkese açık. Bu, açık kaynak dememizin
    nedenlerinden birisidir. Guido'nun görselyöre sayfasına
    linuxfocus.org/~guido. 
 Türkçe'ye çeviri:
 Erdal Mutlu <erdal(at)linuxfocus.org>
 
 İçerik:
 | 
 
(X)dialog: Konuşan kabuklar
 ![[Illustration]](../../common/images/article267/shelltalk.jpg) 
Özet:
    Xdialog ve dialog, kabuk programlarınızı grafik arayüzler ile
    geliştiren klasikleşmiş iki araçtır. 
    Yazıyı anlayabilmek için biraz kabuk programlama bilgisine
    gereksiniminiz olacaktır. Kabuk programlamanın temmelleri hakkında
    biraz daha fazla öğrenmek için Kabuk Programla
    yazısını okuyabilirsiniz.
    
_________________ _________________ _________________
 
     
Giriş
    UNIX kabuk ortamı tek başına bile oldukça üretken bir ortamdır ve
    grafik arayüzler olmadan da çok güzel çalışmaktadır.
    
    Ancak bazı durumlarda, kullanıcı ile iletişimde bulunmak için grafik
    arayüzler önem kazanmaktadır. Sözgelimi, bir programı yüklemek için
    kullanıcının, yüklenecek dizin, çeşitli seçeneklerden seçim yapması
    gibi bazı seçimler yapması gerekebilir ve bunlar için bir yükleme
    arayüzü kullanılabilir.
     
(X)dialog...
    Xdialog ve dialog kullanarak, grafik arayüzlerinizi kısa kabuk
    programlar yazarak tasarlayabilirsiniz. Dialog, terminal (metin ortamı),
    Xdialog ise, X11 pencere sistemi tabanlı programdır.
    İşte bir örnek: 
    Aşağıdaki satırları kobuk penceresi ortamına (xterm, konsole ...)  veya bir kabuk programı
    dosyasına yazabilirsiniz:
    bash
    Xdialog --yesno "Do you want to learn more about Xdialog?" 0 0;\
    case $? in
     0)
     echo "Result: Yes chosen.";;
     1)
     echo "Result: No chosen.";;
     255)
     echo "ESC pressed.";;
    esac
    
    Oluşan kutu, aşağıdaki gibi gözükecektir:
    
      
      ![[yes/no Xdialog]](../../common/images/article267/yesno.gif) 
    
    
    Xdialog yerine dialog kullanmak isterseniz, ikinci satırdaki X
    karakterini kaldırmanız yeterlidir. Buna göre xterm penceresinin
    içinde, başka bir pencere açmadan çalışan,
    curses tabanlı bir uygulama elde etmiş olursunuz.
    Bazı durumlarda kabuk programları için dialog kullanmak daha elverişli
    olabilir, çünkü kabuk programları terminal ortamında çalışmaktadır.
    Özellikle de, doğrudan IP yönlendirilmesi (routing) olmayan ve
    birkaç bilgisayar uzakta bulunan bir bilgisayarda programı çalıştırmak
    daha uygun olmaktadır. Bu durumda dialog ile yazılmış program
    çalışacaktır, ancak bir X11 uygulaması olan Xdialog programını
    çalılşmayacaktır.
    
      
      ![[yes/no dialog]](../../common/images/article267/yesno_noX.gif) 
    
    
    Yukarıdaki dialog/Xdialog kullanan program oldukça
    kullanışsızdır, ancak çok basit bir grafik programın nasıl kolay
    bir şekilde yazılabileceğini göstermesi açısından güzel bir örnektir.
    Takvim, menü, dosya yöneticisi, gelişim çubuğu (progres bar), yazı
    girişi, mesaj, geçişsözcüğü vs. gibi çok ilginç dialog kutular
    vardır.
    dialog --help
    veya
    Xdialog --help
    
    komutunu çalıştırarak, varolan dialog kutularının listesini elde
    edebilirsiniz. Xdialog'un dialog'a göre biraz daha fazla seçeneğe
    sahiptir.
     
Nasıl çalışıyor?
	  Dialog kutuları komut satırından yapılandırılmaktadır.
	dialog --yesno "text string" <height>
    <width>
    Xdialog veya dialog yazdıktan sonra, kullanmak istediğiniz kutunun
    adını ve ardından ona uygun parametrelerini yazmanız gerekmektedir.
    
    yesno kutusu 3 parametre almaktadır.
    <height> ve  <width> parametrelerine sıfır verebilirsiniz.
    Bu durumda, kutunun geometrisi otomatik olarak, yazının büyüklüğüne
    göre ayarlanacaktır. Seçimden elde edilen sonuç çıkış değeri olarak
    verilmektedir ve kabuk içerişinden "$?" değişkeni aracılığı ile
    elde edilebilir. Seçilen isimler gibi birdan fazla geri gönderilmesi
    gereken değer varsa, geridönüş değerleri standart hata aygına
    yazılmaktadır. Standart hata aygıtına yazılanlar genellikle ekrana
    yazılmaktadır. Ancak, "2>" yönlendirilmesi kullanılabilir.
	  
    
    Çok basit ve bir o kadar da kullanışlı bir çözümdür.
     
Gerçek uygulamalar
    Şimdi, Xdialog/dialog'un normal kabuk programlarına göre
    nasıl üstünlük sağladığını gösteren gerçek bir uygulama yazalım.
    Yazacağımız program, bir menüden çeşitli İsternet Servis
    Sağlayıcılarını seçen ve bağlantı sağlayan bir program olacaktır.
    Bu program Mart 2001'de yayınlanan
    İnternet erişiminiz için
    farklı ISS'lerin kullanımı
    yazısındaki ppp-on/ppp-off betiklerine gereksinim duymaktadır.
    Kabuk programının adı
    pppdialout
    dır ve bağlı olup olmamanıza göre farklı menüler görüntülemektedir.
    
#!/bin/sh
#
#DIALOG=Xdialog
DIALOG=dialog
#
# name of your default isp:
defaultisp=maxnet
#
error()
{
    echo "$1"
    exit 2
}
help()
{
  cat <<HELP
pppdialout -- select an ISP and dial out.
All available ISPs must have a config file in /etc/ppp/peers
pppdialout executes the ppp-on/ppp-off scripts as described
in http://linuxfocus.org/English/March2001/article192.shtml
pppdialout, copyright gpl, http://linuxfocus.org/English/November2002
HELP
  exit 0
}
# parse command line:
while [ -n "$1" ]; do
case $1 in
    -h) help;shift 1;; # function help is called
    --) shift;break;; # end of options
    -*) echo "error: no such option $1. -h for help";exit 1;;
    *)  break;;
esac
done
tempfile=/tmp/pppdialout.$$
trap "rm -f $tempfile" 1 2 5 15
# check if we have a ppp network interface
if /sbin/ifconfig | grep '^ppp' > /dev/null; then
    # we are already online
    $DIALOG --title "go offline" --yesno "Click YES to \
                     terminate the ppp connection" 0 0
    rval="$?"
    clear
    if [ "$rval" = "0" ]; then
        echo "running /etc/ppp/scripts/ppp-off ..."
        /etc/ppp/scripts/ppp-off
    fi
else
    # no ppp connection found, go online
    # get the names of all available ISP by listing /etc/ppp/peers
    for f in `ls /etc/ppp/peers`; do
        if [ -f "/etc/ppp/peers/$f" ]; then
            isplist="$isplist $f =="
        fi
    done
    [ -z "$isplist" ]&&error "No isp def found in /etc/ppp/peers"
    #
    $DIALOG --default-item "$defaultisp" --title "pppdialout"  \
         --menu "Please select one of\
    the following ISPs for dialout" 0 0 0 $isplist 2> $tempfile
    rval="$?" # return status, isp name will be in $tempfile
    clear
    if [ "$rval" = "0" ]; then
        isp=`cat $tempfile`
        echo "running /etc/ppp/scripts/ppp-on $isp..."
        /etc/ppp/scripts/ppp-on "$isp"
    else
        echo "Cancel..."
    fi
    rm -f $tempfile
fi
# end of pppdialout
    Betik nasıl çalışmaktadır?
    İlk olarak error ve help gibi bazı fonksiyonlar tanımlıyoruz. Daha
    sonra komut satırından verilen parametreler denetlenmekte ve geçici
    bir dosya (/tmp/pppdialout.$$) için isim tanımlanmaktadır. $$
    çalışmakta olan sürecin (programın) süreç numarasıdır ve her
    bilgisayarda bu numara tekil olarak belirlenmektedir.
    Program anormal olarak kesildiğinde, sözgeşimi crtl-C tuşlarına
    basarak, trap ile belirtilen kısım çalıştırılmaktadır. Bizim
    örneğimizde geçici dosya burada silinmektedir. Daha sonra
    bağlı olup olmadığımızı denetlemekteyiz (/sbin/ifconfig | grep
    '^ppp'). Eğer, bağlı isek, yukarıda da gördüğünüz gibi bir yesno
    kutusu ekrana gelmektedir ve kullanıcıya bağlantıyı kesmek isteyip
    istemediği sorulmaktadır. Eğer, henüz bağlı değilsek, bir menü kutusu
    ekrana getirilmektedir. Varolan tüm İSS'cılarının isimlerini
    /etc/ppp/peers dosyasına bakarak elde etmekteyiz. Menü kutusunun
    yazılış biçimi:
    dialog --menu "text" <height>
    <width> <menu height> <tag1>
    <description> ...
    dır.  <height>, <width> ve <menu height>
    değerleri sıfır olarak verilmistir (Yani boyutlar otomatik olarak
    ayarlanmaktadır. Yukarıya bakınız.). Daha sonra programa (<tag1>
    <description>) çiftlerini yazmak gereklidir. Bizim program için
    açıklamaya (description) gerek yoktur, o yüzden herhangibir şey yazmak
    mümkündür (Biz == yazdık.) isplist değişkenindeki veri aşağıdaki gibi
    olacaktır:
    isp1 == isp2 == isp3 ==
    Kullanıcının seçimi (X)dialog tarafından standart hata aygıtına
    yazılacaktır. "2> $tmpfile" komutu, bunu tmpfile dosyamıza
    yönlendirmiş olacaktır. Menü kutusu ayrıca cancel (iptal) tuşuna
    basma olasılığı sunmaktadır. Dolayısıyla, hangi tuşa basıldığını öğrenmek
    için $? (çıkış durum bilgisi) değerine bakmamız gerekmektedir.
    
    
    Bu kadar teori yeter. İşte programın görünüşü
    
      ... Xdialog ile GTK GUI:
      ![[pppdialout with xdialog]](../../common/images/article267/xdialog_1.gif)
      ![[pppdialout with xdialog]](../../common/images/article267/xdialog_2.gif)
      ... terminalde curses tabanlı dialog ile:
      ![[pppdialout with dialog]](../../common/images/article267/dialog_1.gif)
      ![[pppdialout with dialog]](../../common/images/article267/dialog_2.gif)
      
    
     
Daha fazla uygulamalar
    Size bir uygulamamız daha var. Adı mktgz dir ve
    Xdialog'un checklist (seçim listesi) kutusunu kullanmaktadır. Terminalde
    çalışan dialog programının checklist yoktur. Dolayısıyla, program
    sadece Xdialog ile çalışmaktadır. mktgz programını tar.gz paketleri
    oluştrmak için kullanabilirisniz.
    mktgz yourpackage .
    Bu komut bulunduğunuz (".") dizindeki tüm dosyları görüntülemektedir
    ve bunların arasından hangilerini yourpackage.tar.gz paketine almak
    istiyorsanız, onları seçmeniz mümkün. Programı
    buradan (mktgz.txt)
    elde etmeniz mümkündür. Programı satır satır anlatmayacağız, çünkü
    artık onu  anlayacak kadar öğrenmiş olmalısınız.
  
  
    Xdialog ve dialog programları "samples" adında örnek programların
    bulunduğu dizinle birlikte gelmektedir. Burada daha fazla
    örnek bulabilirsiniz (RedHat 7.3'te bu dizin
    /usr/share/doc/Xdialog-2.0.5/samples dır.).
    Ancak, bunları kullanırken dikkatli olun, çünkü bunların bazıları
    gerçekten birşeyler yapmaktadır ve sırf gösteriş (demo) uygulamaları
    değildir.
     
Sonuç
    Xdialog ve dialog birçok farklı dialog kutuları sunmaktadır.
    Hertür kabuk betiğinde bunların hepsi kullanıma uygun değildir.
    Kabuğun kendisi zaten çok "güçlü" bir ortamdır. Yoltanımını tab'lar
    ile tamamlamak, GUI (Grafik Uygulama Arayüzü) den seçmekten daha
    hızlıdır. Özellikle kabuğun boru (pipe) özelliğini kullanarak, bir
    komutun çıktısını başka komutu girdisi olarak verebilme özelliği çok
    güçlü bir araçtır. Yani şöyle birşey:
grep -i "somestring" file.txt | sort | uniq | wc -l
    (UNIX kabukları ile tecrübesi olmayanlar için açıklama:
    Bu komutlar file.txt dosyasındaki "somestring" i içeren
    tüm tekil satırları saymaktadır.
    Bu şekilde borulama kullanabilmek, tüm komutların komut stırından
    verilen parametreler ile denetlenmesinden dolayı mümkün olmakatdır.
    Başka bir deyişle, bu komutlar durup, kullanıcıdan nasıl devam etmeleri
    gerektiğine ilişkin sorular sormamaktadır.
    Ancak, grafik arayüzlü uygulamalarının daha fazla kullanışlı olduğu
    durumlar da vardır. Xdialog ve dialog'un kullanımı oldukça basittir,
    ancak bunlar gerçek grafik arayüzlü uygulamalar kadar güçlü
    değildir. Bunlar, sadece ASCII olan uygulamalar ile grafik arayüzlü
    uygulamalar arasındaki açığı kapatmaktadır.
    
     
Xdialog ve dialog nereden elde edilebilir?
    Xdialog ve dialog programlarını bulmak için ilk bakacağınız yer,
    kullandığınız Linux dağıtımının CD'leri olmalıdır. Belkide
    sizteminizde yüklü bile olabilirler (Bilgisayarınıza sorun: rpm -qil
    Xdialog, dpkg -L Xdialog). Xdialog sanaldoku yöresi
    http://www.chez.com/godefroy/
     dir. dialog'un sanaldoku yöresi 
    http://hightek.org/dialog/
    dir. Dolayısıyla dialog/Xdialog programlarını buralardan da elde
    edebilirisiniz.
     
Referanslar
    
    
  
 
Bu yazı için görüş bildiriminde bulunabilirsiniz
Her yazı kendi görüş bildirim sayfasına sahiptir. Bu sayfaya yorumlarınızı yazabilir ve diğer okuyucuların yorumlarına bakabilirsiniz.
2003-03-05, generated by lfparser version 2.31