(X)dialog: Konuşan kabuklar
ArticleCategory: [Choose a category, translators: do not
translate this, see list below for available categories]
UNIXBasics
AuthorImage:[Here we need a little image from you]
TranslationInfo:[Author + translation history. mailto: or
http://homepage]
original in en Katja and Guido Socher
en to tr:Erdal Mutlu
AboutTheAuthor:[A small biography about the author]
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.
Abstract:[Here you write a little summary]
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.
ArticleIllustration:[One image that will end up at the top
of the article]
ArticleBody:[The main part of the article]
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:
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.
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:
... terminalde curses tabanlı dialog ile:
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