Kabuğu daha etkin ve verimli bir şekilde kullanabilmemiz için mutlaka kullanmakta olduğumuz sistemi , dosya ve dizin hiyerarşisini bilmemiz gerekmektedir.Bu konu hakkında geniş bilgi için ilerleyen zamanlarda buradan sizlere dilimin döndüğünce birşeyler yazmaya çalışacağım.

Kabuk programlamaya giriş yapabilmek için; sahip olduğumuz sistemde kullandığımız kabuk komutlarını kısaca gözden geçirmenizde fayda var sanırım.Bunlara kısaca göz atacak olursak;

Komut Kullanım Etkisi

ls,dir,vdir

ls /dizin/dizin

Dizin içeriğini listeler,görüntüler.

mv

mv eski /yeni/yeni

Dosyaları taşır,yeniden adlandırmayı sağlar.

cp

cp kaynak hedef

Kaynağı hedefe kopyalamayı sağlar.

ln

ln kaynak hedef

Kaynak dosyadan hedefe link atar.

cat

cat dosya.txt

Bir dosyanın içeriğini görüntüler.

grep

grep arama_metni aranacak_dosya(lar)

Arama metnini aranacak dosyalar içerisinde arar.

diff

diff dosya1 dosya2

İki dosyayı karşılaştırır ve çıktı olarak eşleşmeyen satırları verir.

tail

wc

wc dosya_adi

Verilen dosyanın içerisindeki satır sayısını sayar.

sort

sort dosya_adi

Dosya içeriğini sıralar

Genişletme Sembolleri “*,? ve []”

Kullandığımız komutlar ile beraber sıkça dosya yada dizin isimlerini kullanırız.Çok düzenli bir ev dizininiz yoksa yada dosyalarınızı nerye kaydettiğinizi sıkça unutuyorsanız mutlaka dosya yada dizin adlarının genişletilmesi için gereken sembolleri sıkça kullanacaksınız demektir.Örneğin gece geç vakitte hazırladığınız animasyonlu gif dosyalarınızı sabah kalktığınızda bulamıyorsunuz diyelim ve bunu için bahsettiğimiz sembolleri kullanarak dosyalarımızı bulmaya çalışalım.

* Her karakterin yerine kullanabilirsiniz.

slocate *.gif

Gif uzantılı dosyaları bul

? Sadece tek bir karakter için joker olarak kulanabilirsiniz

slocate ?????.gif

Beş karakter uzunluğunda dosya adına sahip gif dosyalarını bul.

[] Belirteceğiniz karakter sınıflarıyla ullanabilirsiniz.

ls [a-c]*.gif

İlk harfi a,b yada colan gif dosyalarını listeler.

ls on[a-l].gif

Ilk iki harfi on olan son harfi a ile l arasındaki karakterlere sahip gif dosyalarını listele.

Yönlendirme Sembolleri “> ve >>”

Yönlendirme sembolleri adından da anlaşılacağı üzere bir yerden başka bir yere yönlendirme yapmamızı sağlarlar.Klavyemiz ile kabuk a yazdığınız bir komut için, klavyeden girdi , ekrandan çıktı almış oluruz.Sözgelimi;”arch” komutunu klavyeden gireriz girdimiz klavyeden okunur ve girdi sağlanır , ekranda “i686” bilgisi çıkar,bilgi ekranımıza çıktı olarak gönderilir ve bu şekilde çıktı sağlanmış olur.Bu noktada biraz Linux bilgisi ile yönlendirme sembollerini bağdaştırmak ileride yazacağınız kabuk programlarınız için faydalı olacaktır kanımca.Bildiğimiz üzere bir Unix versiyonu olan Linux, Unix’te bulunan dosyalara fiziksel olarak erişimde dosyaların rasgele düzenlenmiş bloklar halinde olması özelliğini aynen kendi içinde de barındırmaktadır.Ancak,mantıksal olarak ise tüm dosyalar sekizli(byte) lerin sürekli akışı olarak düzenlenmektedir.Bazı durumlar haricinde kullanıcı herhangi bir dosyanın fiziksel yapısına referans veremez,bağ atayamaz.Sistem girdi/çıktı işlemleri de sistem tarafından bu şekilde yapılmaktadır, girdi/çıktı verileri birer dosya gibi düzenlenir.Değerli büyüklerimizin her zaman dediği Linux/Unix’te herşey dosyadır cümlesinin geliş noktası da burasıdır aslında:).En basit anlatımıyla herşey dosyadır prensibinden yola çıkacak olursak ekran,klavye gibi aygıtlara birer dosya gibi davranılmaktadır.Girdiyi,klavye yerinebir dosyadan okuyabilir yada çıktıyı ekranınız / yazıcınız yerine bir dosyaya gönderebilirsiniz.Bu işlemleri ise dediğimiz gibi yönlendirme sembolleri ile yapabilirsiniz.Örneklerle konuya devam edelim;

bash$ ls > dosya_listesi

Bu komut ile yapılan işlem klavyeden alınan girdi,ls komutu, ekran yerine dosya_listesi dosyasına çıktı olarak gönderilmektedir.

bash$ cat /etc/my.cnf > my.cnf-yedek

Cat komutu ile /etc/my.cnf dosyamızın normalde ekranda görüntülenecek çıktısını yönlendirme sembolü kullanarak my.cnf-yedek dosyasına çıktı olarak gönderdik.

Bu tür bir durumda my.cnf-yedek dosyasının zaten sistemde varolduğunu düşünelim ve üzerine yazılması işlemini de istemiyor olalım.Yukarıda verdiğimiz komut my.cnf-yedek sistem de var olsa da ,olmasa da yeni my.cnf-yedek dosyasını oluşturacaktır.Ancak noclobber özelliği ile dosyaların üzerine yazılmasını engelleyebilirsiniz.Bu tür bir durum için var olan dosyalara yönlendirme yapsanız dahi yönlendirme işlemi gerçekleşmeyecektir.Noclobber özelliğini ayarladı iseniz ve aynı zamanda da halen var olan bir dosyanın üzerine de yönlendirme yapmak istiyorsanız bunun için de yönlendirme sembolünden sonra bir (!) ünlem işareti kullanarak isteğinizi gerçekleştirebilirsiniz.

Noclobber özelliğini kabuğunuzun ayarlarını okuduğu konfigürasyon dosyasına yazabilir bu sayede varsayılan işlem olarak kalmasını sağlayabilirsiniz.Bash kabuğu için noclobber ı şu şekilde ayarlayabilirsiniz;

set -o noclobber

Boru İşlemleri,Standart Çıktının Elenerek Seçilmesi “|”

Kabukta çalışırken kimi zaman bir komutun çıktısını diğer bir komutun girdisi olarak göstermemiz gerekecektir.Tahmin edersiniz ki bu işlem için ilk olarak girdiyi oluşturacak birinci komut,birinci komutun çıktısını alıp kendisine girdi olarak atayacak olan ikinci komut olmak üzere iki komuta ihtiyacımız olacak.

ls ve more komutu ile bu tür bir boru bağlantısı yapalım.Bu işlemde ls komutunun sağladığı çıktı more komutuna girdi olarak gelecektir ve ls komutu ile sağlamnan çıktı more komutu tarafından işlencektir.ls ve sort kullancak olursak ise ls in sağladığı çıktı sort -n komutu ile nümerik olarak sıralancaktır.

ls | more

ls | sort

Bir diğer örnek olan ls komutu ve grep komutu ile yapacağımız boru işleminde ise yine ls in çıktısı grep komutu tarafından işlencek ve içerisinde abc geçen dosya yada dizinler son çıktı/görünür çıktı olarak karşımıza gelecektir.

ls | grep abc

Kabuk İşlemleri için kullanılan diğer semboller

Kabuk ile programlama yapmanın yanısıra günlük kullanımda da işimize yarayan ,işlerimizi kolaylaştıran birçok komut yada komutlar ve onlarla birlikte kullanılan semboller bulunmaktadır.Tekrar bir tablo yaparak bunlara göz atmamız iyi olacaktır;

&

komut_adı &

Komutu arka planda çalıştırır.

fg %iş_numarası

komut_adı %2

(PID i [2] atanan işlemi ön planda çalıştırır)

İş numarası belirtilen ve arka planda çalışan bir programı yada komutu ön plana taşır yada kesilmiş olan bir işin devam etmesini sağlar.

notify %iş_numarası

Notify %3

(PID i [3] e atanan işlem sonlanınca haber verir)

İş numarası belirtilen uygulamanın bittiğini haber verir.

kill %iş_numarası

kill %PID

kill komut_adı

kill %3

kill %2087

killall gmplayer

İş numarası,uygulama simi yada PID belirtilen süreçi sonlandırmaya yararlar.

jobs

jobs

Arka planda çalışan işleri görüntüler.

ps

ps

Arka plan işleri ile birlikte çalışmakta olan tüm süreçleri görüntüler.

Kabukta Standart Değişkenler ve Değişken Oluşturma

Kabuk programlama yapacaksak değişkenlerin neden tanımlandığın ,nasıl tanımladığını bilmemiz gerekir.Sistemde kullanılan birçok değişken vardır.Bunları görmek için $ tuşuna bastıktan sonra TAB ile hepsini görüntüleyebilriz.

Örneğin $DISPLAY değişkenini görüntülemek için

echo $DISPLAY dememiz yeterli olacaktır.Görüntü hakkında bilgi almamızı sağlayacaktır.

Sistemde var olan hazır değişkenlerin yanısıra kendimizde değişkenler tanımlama , oluşturmak gereği duyarız.Bir kabuk programında bir değişkene ilk defa bir değer atandıktan sonra değişken adını kullanarak o değere referans veririz.Genellikle değişken değerleri komutlar için argümanlar olarak kullanılırlar.Bir değişkenin değerine referans vermek içinse o değişken adının önüne $ işareti koyarız.Sözgelimi kabukta yazacağınız;

bash-$ a=”Açık Kaynak Kodu Kullanın”

bash-$ echo $a

bash-$ Açık Kaynak Kodu Kullanın

çıktısını verecektir.

Yada

bash-$ b= 2

bash-$ c=4

bash-$ d= $(expr $b + $c)

bash-$ echo $d

6

bash-$

çıktısını verecektir.Burada değişken tanımlarken dikkat etmeniz gereken en önemli husus değişkeni ilk defa tanımladıktan sonra diğer kullanımlarında değişkenin başına $ işaretini koymanzı gerektiğidir.Örnek verilecek olursa;

bash-$ degisken=7

bash-$ echo degisken

degisken

bash-$ echo $degisken

7

bash-$

olacaktır.

Değişken tanımlarken dikkat etmeniz gereken bir diğer noktada ; değerin sağdan sola işlendiğidir.Değişken olarak 20 ye referans vermemiz kabuk tarafından algılanmaycaktır.

Sayi=20 Doğru

20=Sayi Yanlış

Tanımladığımız değişkenin değeri ile kendisi arasında kullanılan eşleme operatörü “=” işareti ile değişken ve değeri arasında boşluk olmamasına dikkat etmeniz gerekmektedir.

Sayi = 20 Yanlış

Sayi =20 Yanlış

Sayi=20

Değişken adlarını tanımlamanın en çok kullanıldığı yerlerden biriside dizin adlarının değişken olarak tanımlanmasıdır.Çok uzun bir dizin yol adının altında bulunan bir dosyaya her defasında ulaşmak için o dizinin yol adını yazmak hem uzun zaman alacaktır hem programcıyı sıkacaktır.:)/var/www/htdocs/future-options/kullanicilar/ dizini altında bulunan bir dosyaya her defasında bilgi girmemiz gerektiğini düşünelim ,bunun için bu dizine bir değişken atanır ve bu dizin her defasında kendisine referans veren değişken adı ile birlikte çağrılır.

bash-$ kullanici_dir=/var/www/htdocs/future-options/kullanicilar/

bash-$ cd $kullanici_dir

bash-$ pwd

/var/www/htdocs/future-options/kullanicilar/

bash-$

Bu şekilde kabuğumuzda tanımlanmış hazır değişkenler vardır.$HOME değişkeni bu türden bir değişkendir ve kullanıcının ev dizini bilgisini saklar.