[LinuxFocus-icon]
Ev  |  Erişimdüzeni  |  İçindekiler  |  Arama

Duyumlar | Belgelikler | Bağlantılar | LF Nedir
Bu makalenin farklı dillerde bulunduğu adresler: English  Castellano  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  

convert to palmConvert to GutenPalm
or to PalmDoc

[Photo of the Authors]
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]

Ö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]

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]

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]
[pppdialout with xdialog]

... terminalde curses tabanlı dialog ile:

[pppdialout with dialog]
[pppdialout with dialog]

 

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.
 talkback page 

Görselyöre sayfalarının bakımı, LinuxFocus Editörleri tarafından yapılmaktadır
© Katja and Guido Socher, FDL
LinuxFocus.org

Burayı klikleyerek hataları rapor edebilir ya da yorumlarınızı LinuxFocus'a gönderebilirsiniz
Çeviri bilgisi:
en --> -- : Katja and Guido Socher <katja(at)linuxfocusorg, guido(at)linuxfocus.org>
en --> tr: Erdal Mutlu <erdal(at)linuxfocus.org>

2002-11-09, generated by lfparser version 2.27