10 – Girdi ve Çıktı Yönlendirme ile Verimli Bash Script Yazımı

Bash script yazarken, komutların çıktılarını başka komutlara aktarmak, çıktı dosyalarını oluşturmak veya hataları kaydetmek gibi işlemler, girdi ve çıktı yönlendirme teknikleriyle yapılır. Bu yazıda, Bash scriptlerinde girdi ve çıktı yönlendirmesinin nasıl yapıldığını, temel teknikleri ve uygulama örneklerini inceleyeceğiz.
Girdi ve Çıktı Yönlendirme Nedir?
Bir komutun çıktısı genellikle ekrana (standart çıktı, stdout
) yazdırılır. Ancak, bazı durumlarda bu çıktıyı bir dosyaya kaydetmek, başka bir komuta aktarmak veya hataları ayrı bir yere yönlendirmek gerekebilir. Bash script’lerde bu tür işlemler >
, >>
, 2>
, ve |
gibi operatörlerle yapılır.
1. Standart Çıktı Yönlendirme (>
, >>
)
Bash’te bir komutun çıktısını bir dosyaya yönlendirmek oldukça yaygındır. Bu, >
veya >>
operatörleri kullanılarak yapılabilir.
>
: Bir dosyaya çıktı yönlendirir ve dosyanın içeriğini sıfırlar.>>
: Bir dosyaya çıktı yönlendirir ve dosyanın sonuna ekler (var olan içeriği korur).
Örnekler:
# Mevcut dizindeki dosyaları bir dosyaya yazdırma
ls > dosya_listesi.txt
# Yeni bir satır ekleyerek aynı dosyaya yazdırma
echo "Yeni bir satır ekleniyor" >> dosya_listesi.txt
Yukarıdaki komutlarda >
operatörü kullanılarak ls
komutunun çıktısı dosya_listesi.txt
adlı dosyaya yazıldı. Eğer dosya zaten varsa, içeriği sıfırlanır ve üzerine yazılır. >>
operatörü ise dosya zaten varsa yeni bilgiyi ekleyerek dosyanın mevcut içeriğini korur.
2. Standart Hata Yönlendirme (2>
)
Bash scriptlerde bazen hata mesajlarını (stderr
) yönetmek önemlidir. Normalde hata mesajları ekranda gösterilir, ancak bu mesajları dosyaya yazdırmak ya da hata raporlama amacıyla kullanmak da mümkündür.
2>
: Hataları (standart hata,stderr
) belirtilen dosyaya yönlendirir.
Örnek:
# Hata mesajlarını bir dosyaya yönlendir
ls /olmayan_dizin 2> hata_logu.txt
Bu komut, var olmayan bir dizini (/olmayan_dizin
) listelemeye çalışır ve oluşan hata mesajını hata_logu.txt
dosyasına kaydeder.
3. Standart Çıktı ve Hata Yönlendirme (>
, 2>
birlikte)
Bazen hem standart çıktı hem de hata mesajlarını tek bir dosyaya yönlendirmek gerekebilir. Bu durumda şu yöntem kullanılır:
# Standart çıktı ve hatayı aynı dosyaya yönlendir
ls /olmayan_dizin > output_ve_hatalar.txt 2>&1
Burada 2>&1
, stderr
‘in (2>
) stdout
‘a (1
) yönlendirildiği anlamına gelir. Böylece hem normal çıktılar hem de hatalar output_ve_hatalar.txt
dosyasına kaydedilir.
4. Pipe (|
) Kullanarak Komutları Zincirleme
|
(pipe) operatörü, bir komutun çıktısını başka bir komuta girdi olarak yönlendirmek için kullanılır. Bu sayede birden fazla komut bir zincir gibi bağlanabilir.
Örnek:
# Dosya listesini filtreleyerek sadece txt dosyalarını göster
ls | grep ".txt"
Bu komut, mevcut dizindeki dosyaları listeleyip (ls
) ardından sadece .txt
uzantılı dosyaları gösterir (grep ".txt"
). Burada ls
komutunun çıktısı grep
komutuna girdi olarak verilmiştir.
5. tee
Komutu ile Çıktıyı Hem Dosyaya Hem de Ekrana Yönlendirme
Bazen komut çıktısını hem dosyaya kaydetmek hem de ekranda görmek isteyebiliriz. Bu durumda tee
komutu kullanılır.
tee
: Çıktıyı hem ekrana yazar hem de belirtilen dosyaya kaydeder.
Örnek:
# Mevcut dizindeki dosyaları hem ekrana yaz hem de bir dosyaya kaydet
ls | tee dosya_listesi.txt
Burada ls
komutunun çıktısı dosya_listesi.txt
dosyasına kaydedilirken aynı zamanda ekrana da yazdırılır. Eğer dosyaya ekleme yapmak istiyorsanız -a
(append) seçeneğini kullanabilirsiniz:
ls | tee -a dosya_listesi.txt
Bu komut, mevcut dosyanın sonuna yeni çıktı ekleyecektir.
Gerçek Hayat Uygulaması: Log Dosyaları Yönlendirme
Bir sistem yönetimi script’inde, log dosyaları oluşturmak ve hataları takip etmek oldukça önemlidir. Aşağıda, bir yedekleme script’inde çıktı ve hata mesajlarının yönlendirilmesi örneği verilmiştir:
#!/bin/bash
echo "Yedekleme işlemi başladı..." > backup_log.txt
tar -czf /yedekler/ev_yedegi.tar.gz /home/kullanici 1>> backup_log.txt 2>> backup_errors.txt
if [ $? -eq 0 ]; then
echo "Yedekleme başarılı." >> backup_log.txt
else
echo "Yedekleme sırasında hata oluştu." >> backup_log.txt
fi
Bu script, /home/kullanici
dizinini /yedekler/ev_yedegi.tar.gz
dosyasına yedeklerken oluşan standart çıktıları backup_log.txt
dosyasına, hata mesajlarını ise backup_errors.txt
dosyasına kaydeder. Bu sayede yedekleme işleminin nasıl geçtiğini ve varsa hataları ayrı ayrı takip edebilirsiniz.
Girdi ve çıktı yönlendirme, Bash script yazarken oldukça önemli ve kullanışlı bir araçtır. Standart çıktı, hata ve girdi işlemlerini yönetmek; dosyaları ve süreçleri izlemek açısından kritik bir rol oynar. Bu yazıda bahsedilen operatörler ve tee
komutu gibi araçlar, daha verimli ve düzenli script’ler yazmanıza yardımcı olabilir.
Bu yöntemleri kullanarak scriptlerinizi daha dinamik ve işlevsel hale getirebilir, çıktıların doğru bir şekilde yönlendirilmesini sağlayabilirsiniz. Bu da hata ayıklama süreçlerini daha kolay ve güvenilir hale getirir.