-
Sadrazamv4
instagram:sadrazam.spy Tg:Sadrazamv4
🚀 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! 🐚✨
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