Kabuk programlama

**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.
```sh
#!/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:
```sh
#!/bin/sh

clear
ls -al
```
Bu 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:
```sh
#!/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:
```sh
#!/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ı bildir
```
Bu 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