🚀 BAŞTAN SONA BASH SCRIPTING BÖLÜM-8: Hata Yönetimi, Debugging ve Sinyal Yakalama (`trap`) 🚨

Konu Özeti

Bash betiklerinde hata yönetimi, hata ayıklama ve sinyal yakalama konuları ele alınıyor. Çıkış kodları ($?), set -euo pipefail ile katı güvenlik modu, set -x ile debugging ve trap komutuyla sinyal yakalayıp temizlik yapma yöntemleri örneklerle açıklanıyor. Betiklerin güvenilirliğini artırmak için profesyonel ipuçları sunuluyor.

🚀 BAŞTAN SONA BASH SCRIPTING BÖLÜM-8: Hata Yönetimi, Debugging ve Sinyal Yakalama (`trap`) 🚨

Selamlar! Serimizin 8. bölümüne hoş geldiniz.

Önceki bölümde metin işleme devleri olan `cut`, `awk` ve `sed` komutlarını ve pipeline kullanımını öğrenmiştik. Bu bölümde ise betiklerimizin güvenilirliğini artıracak olan **Hata Yönetimi (Error Handling)**, **Hata Ayıklama (Debugging)** ve **Sinyal Yakalama (`trap`)** konularını inceleyeceğiz.

Bir betiğin patlamadan, sessizce hatalı çalışmasını engellemek ve çökme durumunda arkasında çöp bırakmamasını sağlamak profesyonel Bash geliştiriciliğinin en kritik adımıdır.

---

📌 1. Çıkış Kodları (Exit Status / `$?`) 🚥

Linux'ta çalıştırılan her komut bittiğinde işletim sistemine bir **Çıkış Kodu (Exit Status)** bırakır.

• `0`: İşlem TAMAMEN BAŞARILI oldu.
• `1 - 255`: İşlem sırasında BİR HATA oluştu.

Mevcut son komutun çıkış kodunu okumak için **`$?`** özel değişkeni kullanılır.

#!/bin/bash

# Var olmayan bir dizine girmeye çalışalım:
cd /var/olmayan_dizin 2>/dev/null

if [ $? -eq 0 ]; then
echo "Dizine başarıyla girildi. ✅"
else
echo "HATA: Dizine girilemedi! Çıkış Kodu: $?" ❌
fi

### Kendimiz Çıkış Kodu Döndürme (`exit`):
Betik içinde kritik bir hata aldığımızda betiği durdurup özel bir hata kodu döndürebiliriz:

#!/bin/bash

if [ "$USER" != "root" ]; then
echo "Bu betik yalnızca root yetkisiyle çalıştırılabilir! ⛔"
exit 1 # Betiği 1 hata koduyla anında sonlandırır
fi

---

🛠️ 2. Sıkı Güvenlik Modu: `set -e`, `set -u`, `set -o pipefail` 🛡️

Varsayılan olarak Bash, bir satırda hata alsa bile sonraki satırları çalıştırmaya DEVAM EDER. Bu durum hatalı silme komutlarında felaketlere yol açabilir!

Betiğin en üstüne ekleyeceğimiz katı mod seçenekleri:

• `set -e`: Herhangi bir komut hata verirse (`exit status != 0`) betiği ANINDA DURDURUR.
• `set -u`: Tanımlanmamış (boş) bir değişken kullanılmaya çalışılırsa HATA VERİR ve DURUR.
• `set -o pipefail`: Pipe (`|`) zincirindeki herhangi bir komut hata verirse tüm zinciri HATA kabul eder.

İdeal Başlangıç Bloku (Strict Mode):

#!/bin/bash
set -euo pipefail

# Artık betik çok daha güvenli!

---

🔍 3. Hata Ayıklama Modları (Debugging Script) 🐛

Yazdığımız betiğin adım adım nasıl çalıştığını görmek ve hataları tespit etmek için kullanabileceğimiz parametreler:

### A. Terminalden Çağırırken Debugging:
- `bash -x betik.sh`: Çalıştırılan her satırı ve değişkenlerin genişletilmiş hallerini ekrana basar.
- `bash -n betik.sh`: Kodu çalıştırmaz, sadece sözdizimi (syntax) hatası olup olmadığını kontrol eder.

### B. Betik İçinde Belirli Bir Bölümü Debug Etme:

#!/bin/bash

echo "Bu kısım normal çalışır."

set -x # Debug modunu başlat
read -p "Adınız: " ISIM
echo "Merhaba $ISIM"
set +x # Debug modunu kapat

echo "Bu kısım tekrar normal çalışır."

---

🧹 4. Sinyal Yakalama ve Temizlik: `trap` Komutu 🪤

Kullanıcı betik çalışırken `CTRL+C` (SIGINT) bastığında veya betik beklenmeyen bir şekilde kapandığında arka planda oluşturulan geçici dosyaların (temp files) silinmesi gerekir.

`trap`, sistem sinyallerini veya betiğin çıkış (`EXIT`) anını yakalayarak özel bir temizlik fonksiyonu çalıştırmamızı sağlar.

Sık Kullanılan Sinyaller:
- `EXIT`: Betik herhangi bir sebeple kapandığında (Normal bitiş veya hata).
- `SIGINT` (2): Kullanıcı `CTRL+C` bastığında.
- `SIGTERM` (15): Sonlandırma sinyali gönderildiğinde.

#!/bin/bash
set -euo pipefail

# Geçici bir dosya oluşturalım:
GECICI_DOSYA=$(mktemp /tmp/gecici_veriler.XXXXXX)

# Temizlik Fonksiyonu:
temizlik() {
echo -e "\n[!] Temizlik yapılıyor, geçici dosya siliniyor: $GECICI_DOSYA"
rm -f "$GECICI_DOSYA"
}

# Betik EXIT veya SIGINT aldığında temizlik fonksiyonunu çağır:
trap temizlik EXIT SIGINT

# Senaryo:
echo "Geçici dosyaya veri yazılıyor..."
echo "Önemli Sistem Verisi" > "$GECICI_DOSYA"

echo "İşlem yapılıyor (Çıkmak için CTRL+C basabilirsiniz)..."
sleep 5

echo "İşlem tamamlandı!"
# Betik bittiğinde trap sayesinde 'temizlik' fonksiyonu otomatik çalışacak!

---

📝 Bölüm Özeti ve Gelecek Bölüm 🔮

Bu bölümde çıkış kodlarını (`$?`), `set -euo pipefail` ile katı güvenlik modunu, `set -x` ile hata ayıklamayı ve `trap` komutuyla sinyal yakalayıp temizlik yapmayı öğrendik.

👉 Bölüm 9'da Bizi Ne Bekliyor?
• Zamanlanmış Görevler (Cron Jobs) ve `crontab` Yönetimi
• Betikleri Arka Planda Çalıştırma (`&`, `nohup`, `screen`, `tmux`)
• Loglama Sistemleri (Betik çıktı
larını tarihlerle log dosyasına yönlendirme)

Sorularınızı konu altından iletebilirsiniz. Bir sonraki bölümde görüşmek üzere! 🐚✨

🔒 Bu içeriği görmek için giriş yapın

 
Yanıt yazmak için giriş yapmalısınız
Forum özelliklerini kullanmak ve Level 2 üyelik satın almak için hesabınıza giriş yapın.
135,075Konular
3,297,925Mesajlar
326,260Kullanıcılar
Üst Alt