Kabuk programlama

küçükresim|Bir FreeBSD betik dosyasının ipfirewall yapılandırması için düzenlenmesi
Kabuk betiği (İngilizcesi: shell script), bir Unix kabuğu (bir komut satırı yorumlayıcısı) tarafından çalıştırılmak üzere yazılmış bir bilgisayar programıdır. Kabuk betiklerinin çeşitli lehçeleri komut dili olarak kabul edilir. Kabuk betikleri tarafından gerçekleştirilen tipik işlemler arasında dosya işleme, program çalıştırma ve metin yazdırma yer alır. Ortamı ayarlayan, bir programı çalıştıran ve gerekirse günlükleme veya temizleme işlemleri yapan bir betik, sargı (wrapper) olarak adlandırılır.

Bu terim aynı zamanda, bir işletim sistemi kabuğunun otomatik modda çalıştırılması anlamında daha genel olarak da kullanılmaktadır. Her işletim sistemi bu işlevleri farklı adlarla anmaktadır: toplu işlem dosyaları (MS-DOS-Win95 hattı, OS/2), komut prosedürleri (VMS), kabuk betikleri (Windows NT hattı ve 4NT gibi üçüncü taraf türevleri—makale cmd.exe sayfasında) ve ana bilgisayar işletim sistemleriyle ilişkili çeşitli diğer terimler.

Unix ve Unix benzeri sistemlerde yaygın olarak bulunan kabuklar arasında Korn shell, Bourne shell ve GNU Bash yer alır. Unix tabanlı bir işletim sistemi farklı bir varsayılan kabukla birlikte gelebilir (örneğin macOS'te Zsh), ancak genellikle geriye dönük uyumluluk için bu kabuklar da sistemde bulunur.
 Özellikler 

 Yorum Satırları 
Yorum satırları, kabuk yorumlayıcısı tarafından çalıştırılmaz. Genellikle kare işareti (#) ile başlar ve satır sonuna dek sürer.

 Betik Dili Seçilebilirliği 
, çalıştırılacak betiğin hangi yorumlayıcı ile yürütüleceğini belirlemek için kullanılan özel bir yorum satırıdır. Betiğin ilk satırında yer almalı ve #! ile başlamalıdır. Unix-benzeri işletim dizgelerinde bu işaretten sonra gelen bölüm, betiği yorumlayacak çalıştırılabilir uygulamanın tam yoludur.

 Kısayollar 
Kabuk betikleri, sistem komutlarını daha elverişli hale getiren kısaltmalar olarak kullanılabilir. Ortam değiştirgeleri, komut seçenekleri ya da ek işlem adımları önceden tanımlanmış olabilir; buna karşın betik, sıradan bir Unix komutu gibi çalışmayı sürdürür.

Örnek olarak, dosyaları listeleyen ls komutunun kısa adlandırılmış bir sürümünü l olarak oluşturmaktır. Bu betik, genellikle kullanıcının bin dizininde /home/kullanıcıadı/bin/l yolunda saklanır ve içerisine bazı öntanımlı komut seçenekleri eklenmiştir.#!/bin/sh
LC_COLLATE=C ls -FCas "$@"Burada ilk satır, shebang (#!) kullanılarak, betiği hangi yorumlayıcının çalıştıracağını belirtir. İkinci satır ise ls komutunu; dosya türü simgelerini, sütunlu düzenlemeyi, gizli dosyaları da içerecek şekilde (hiçbirini dışlamadan) ve blok boyutunda dosya boyutlarını gösterecek biçimde çalıştırır.

LC_COLLATE=C ifadesi, harf sıralamasında büyük ve küçük harfleri birleştirmemek ve noktalama işaretlerini yok saymamak için sıralama düzenini C yerelleştirmesine ayarlar. Bu sayede,  ile sıradan dosya adları birbirine karışmaz (noktalı dosyalar genellikle -a gibi seçeneklerle görünür hâle gelir).

"$@" ifadesi, l komutuna verilen tüm girdilerin ls'ye eksiksiz aktarılmasını sağlar; böylece ls'nin tüm alışılmış seçenekleri ve sözdizimi kullanılabilir kalır.

Kullanıcı, sık kullanılan kısa listeleme işlemleri için yalnızca l komutunu çalıştırarak bu betikten yararlanabilir.

Bir başka kısayol örneği, belirli bir dizin içerisindeki tüm dosya ve dizinleri listeleyen basit bir komuttur:#!/bin/sh

clear
ls -alBu durumda betik, olağan başlangıç satırı olan #!/bin/sh ile başlar. Ardından clear komutu çalıştırılarak uçbirim (terminal) temizlenir. Sonraki satırdaki ls -al komutu ise betiğin çalıştırıldığı dizindeki tüm dosya ve dizinleri ayrıntılı olarak listeler.

ls komutuna ait öznitelikler, kullanıcının gereksinimlerine göre değiştirilebilir.

 Toplu İşler 
Kabuk betikleri, bir dizi komutu tek tek elle girilmeksizin ardışık olarak çalıştırabilir. Örneğin, içinde üç C kaynak kodu dosyası bulunan bir dizinde, bu dosyalardan son programı üretmek için gereken dört komutu tek tek çalıştırmak yerine, POSIX uyumlu kabuklar için build adlı bir betik oluşturulabilir. Bu betik, kaynak dosyalarla aynı dizinde saklanır ve derleme işlemini kendiliğinden yapar:#!/bin/sh
printf 'derleniyor...\n'
cc -c foo.c
cc -c bar.c
cc -c qux.c
cc -o myprog foo.o bar.o qux.o
printf 'tamamlandı.\n'Bu sayede kullanıcı, düzenleyiciden çıkıp yalnızca ./build komutunu çalıştırarak güncel programı üretme, deneme ve ardından düzenleyiciye dönme olanağı tanır. Ancak 1980'lerden bu yana, bu tür işler için özel araçlar olan make gibi yapılandırma sistemleri kullanılır hale gelmiştir.

 Genelleştirme 
Basit toplu işler izole görevler için olağandışı değildir, ancak kabuk döngüleri, testler ve değişkenler kullanmak, kullanıcılara çok daha fazla esneklik sağlar. Komut satırından—muhtemelen joker karakterler aracılığıyla—verilen görsel adları ile JPEG görsellerini PNG görsellerine dönüştüren bir POSIX sh betiği, her görselin betik içinde tek tek listelenmesi yerine, aşağıdaki gibi bir dosyada oluşturulabilir. Bu betik genellikle /home/kullanıcıadı/bin/jpg2png gibi bir dosyada saklanır:  
#!/bin/sh  
for jpg; do                                  # verilen her dosya adı için $jpg yerine geçer  
    png=${jpg%.jpg}.png                      # dosya adındaki .jpg uzantısını .png ile değiştirerek PNG adı oluştur  
    printf '"%s" dönüştürülüyor...\n' "$jpg" # betiği çalıştıran kullanıcıya durum bilgisi ver  
    if convert "$jpg" jpg.to.png; then       # ImageMagick tarafından sağlanan convert komutuyla geçici PNG oluştur  
        mv jpg.to.png "$png"                 # başarılıysa geçici PNG dosyasını doğru adla yeniden adlandır  
    else                                     # aksi takdirde hata mesajı ver ve betikten çık  
        printf >&2 'jpg2png: hata: çıktı "jpg.to.png" dosyasına kaydedildi.\n'  
        exit 1  
    fi                                       # "if" test yapısının sonu  
done                                         # "for" döngüsünün sonu  
printf 'tüm dönüştürmeler tamamlandı\n'      # kullanıcıya işlemin başarıyla tamamlandığını bildirBu durumda jpg2png betiği, /home/kullanıcıadı/bin/jpg2png *.jpg şeklinde JPEG görsellerle dolu bir dizin üzerinde çalıştırılabilir.

 Programlama 
Günümüzde kabukların birçoğu, yalnızca daha gelişmiş genel amaçlı programlama dillerinde bulunan kontrol akışı yapıları, değişkenler, yorum satırları, diziler, altyordamlar gibi çeşitli özellikleri de sağlar. Bu tür özelliklerin mevcut olması sayesinde, kabuk betikleriyle oldukça gelişmiş uygulamalar yazmak mümkündür.

Ancak, çoğu kabuk dilinin veri türü sistemleri, sınıflar, çok iş parçacığı (threading), karmaşık matematik işlemleri ve diğer yaygın tam teşekküllü dil özellikleri için çok az desteğe sahip olması ya da hiç desteklememesi nedeniyle hâlâ sınırlıdırlar. Ayrıca genellikle derlenmiş kodlara ya da yüksek performans hedefiyle yazılmış yorumlanmış dillere kıyasla çok daha yavaştırlar.

Standart Unix araçları olan sed ve awk, kabuk programlaması için ek yetenekler sağlar; Perl de diğer betik dilleri gibi (örneğin Tcl) kabuk betiklerine gömülebilir. Perl ve Tcl ayrıca grafik araç takımlarıyla birlikte gelir.

 Tipik POSIX betik dilleri 

 Diğer betik dilleri 

 Yaşam döngüsü 
Kabuk betikleri, yazılım geliştirme sürecinde genellikle ilk aşama olarak kullanılır ve daha sonra sıklıkla farklı bir temel uygulama biçimine dönüştürülür. Bu dönüşüm çoğunlukla Perl, Python veya C gibi dillere yapılır. Yorumlayıcı yönergesi (İngilizcesi: interpreter directive) sayesinde, uygulamanın hangi dilde yazıldığı dosya uzantısıyla belirtilmek zorunda kalmaz; bu bilgi doğrudan betik içinde tanımlanır. Böylece, betiğin farklı bir dilde yeniden uygulanması son kullanıcıyı etkilemeden mümkün olur.

“.sh” dosya uzantısı genellikle bir kabuk betiğini belirtir; ancak çoğu kabuk betiği herhangi bir uzantı taşımaz.

 Avantajlar ve dezavantajlar 

 Betik dilleri arası birlikte çalışabilirlik 

 Diğer işletim sistemlerinde kabuk betikleri 

 En çok bilinen kabuklar 

 bash (Bourne Again Shell)
 csh (C-Shell)
 ksh
 sh
 tcsh
 zsh

 Kaynakça 

*