6 - Standart Girdi Çıktı ve Hata İşlemleri
2026
Komut satırında bir program yalnızca “çalıştırılan bir şey” değildir.
Aynı zamanda veri alır, veri üretir ve hata mesajı da üretebilir.
Bu derste şu sorulara cevap arıyoruz:
Bu mantık kurulduğunda yönlendirme ve pipe kullanımı daha anlaşılır hale gelir.
Bu dersin sonunda şunları yapabiliyor olmanız beklenir:
stdin, stdout ve stderr kavramlarını ayırt etmek| ile bağlayıp küçük boru hatları kurmak2>&1 ifadesinin ne yaptığını ve neden sıranın önemli olduğunu açıklamakBir komut çalıştığında ortaya çıkan her şey aynı türde değildir.
Kabuk, üç farklı veri yolunu birbirinden ayrı tutar:
stdin) → komutun okuduğu veristdout) → komutun ürettiği normal sonuçstderr) → komutun ürettiği hata ve uyarı mesajlarıBu ayrımın nedeni şudur:
Bu yüzden kabuk, girdi, normal çıktı ve hata çıktısını ayrı ayrı yönetir.
| Akış | Numara | Varsayılan davranış |
|---|---|---|
stdin |
0 | klavyeden veya başka bir kaynaktan okur |
stdout |
1 | normal çıktıyı terminale yazar |
stderr |
2 | hata mesajlarını terminale yazar |
Buradaki 0, 1 ve 2 değerleri dosya tanımlayıcısı olarak düşünülebilir.
Kabuk bu numaraları kullanarak şunu söyleyebilir:
stdout)Bir komut çalıştırıldığında üretilen normal veri çoğu zaman standart çıktıya yazılır.
$ ls -l
total 20
drwxr-xr-x 2 user user 4096 Mar 18 10:00 Belgeler
drwxr-xr-x 2 user user 4096 Mar 18 10:00 İndirilenler
...Bu iki örnekte de komuta çıktıyı nereye yazacağını açıkça söylemiyoruz. Bu yüzden çıktı varsayılan olarak terminale gelir.
> ile Standart Çıktıyı Dosyaya YazmaStandart çıktıyı dosyaya yönlendirmek için > kullanırız.
Bu komuttan sonra çıktı ekranda görünmez. Çünkü normal çıktı artık terminale değil, liste.txt dosyasına yazılmıştır.
Dosyayı kontrol edelim:
> ve >>İki benzer ama farklı kullanım vardır:
> dosya yoksa oluşturur; varsa içeriği üzerine yazar>> dosyanın sonuna ekleme yaparÖrnek:
$ echo "birinci satir" > notlar.txt
$ echo "ikinci satir" >> notlar.txt
$ cat notlar.txt
birinci satir
ikinci satirBurada ilk komut dosyayı oluşturur, ikinci komut ise dosyanın sonuna yeni satır ekler.
stdin)Bazı komutlar yalnızca çıktı üretmez; aynı zamanda bir yerden veri de okur.
Bir dosyayı komuta standart girdi olarak vermek için < kullanırız.
Bu kullanımda dosya adı, komutun argümanı gibi değil, komutun okuyacağı giriş kaynağı gibi davranır.
< Ne İşe Yarar?Aşağıdaki iki kullanım benzerdir:
İkisi de satır sayısını verir; fakat aralarında kavramsal fark vardır:
isimler.txt, komutun argümanıdırisimler.txt, komutun standart girdisi olurBu ayrım özellikle pipe ve betik yazarken önem kazanır.
stderr)Komutların ürettiği her mesaj normal çıktı değildir.
Kabuk iki tür çıkışı ayrı tutar:
stdout → normal veristderr → hata ve uyarı mesajlarıVarsayılan durumda ikisi de terminalde görünür; fakat aynı akış değildirler.
Örnek:
Buradaki mesaj normal çıktı değil, hata çıktısıdır.
2> ile Hata Çıktısını AyırmaHata mesajlarını ayrı dosyaya yönlendirmek için 2> kullanırız.
Burada normal.txt boş kalır. Çünkü hata mesajı stdout değil, stderr akışındadır.
Şimdi hatayı ayrıca yönlendirelim:
Buradaki 2, stderr akışının dosya tanımlayıcısını gösterir.
2> Yazıyoruz?Az önceki tabloda şunları görmüştük:
stdin → 0stdout → 1stderr → 2Bu yüzden:
> dosya aslında çoğu kabukta 1> dosya anlamına gelir2> dosya ise açıkça hata akışını yönlendirirYani kabuğa şunu söylemiş oluruz:
2 numaralı akışı bu dosyaya gönder.
Bu mantık, birazdan göreceğimiz 2>&1 ifadesini de anlaşılır hale getirir.
Bazen hem normal çıktıyı hem de hata mesajlarını aynı dosyada toplamak isteriz.
Bunun için önce stdout yönlendirilir, sonra stderr aynı hedefe bağlanır:
$ ls /etc/passwd /olmayan > sonuc.txt 2>&1
$ cat sonuc.txt
/etc/passwd
ls: cannot access '/olmayan': No such file or directoryBuradaki 2>&1 şu anlama gelir:
2> → hata akışıyla ilgilen&1 → bunu 1 numaralı akışın gittiği yere gönderYani stderr, stdout nereye gidiyorsa oraya gider.
2>&1 İfadesini Nasıl Okumalıyız?Şöyle okuyabilirsiniz:
2 numaralı akışı, 1 numaralı akışın bulunduğu hedefe bağla.
Buradaki fikir “ikisini birleştir” demekten biraz daha özeldir. Aslında olan şudur:
stdout bir hedefe giderstderr, o hedefe bağlanırBu yüzden 2>&1 ifadesi sembolik görünse de mantığı nettir.
Aşağıdaki iki komut aynı değildir:
İlk kullanımda:
stdout dosyaya giderstderr de stdout nereye gidiyorsa oraya bağlanır Sonuç: ikisi de dosyaya giderİkinci kullanımda:
stderr, o anda stdout nereye gidiyorsa oraya bağlanır o anda stdout hâlâ terminaldirstdout dosyaya yönlendirilir Sonuç: stdout dosyaya gider, stderr terminalde kalırBu nedenle pratikte en sık kullanılan biçim şudur:
|) Nedir?Pipe, bir komutun standart çıktısını başka bir komutun standart girdisine bağlar.
Burada:
ls -l /etc çıktı üretirless komutuna aktarılırBu yapı sayesinde uzun çıktılar ekranda daha rahat incelenir.
Soldan sağa düşünün:
Burada süreç şöyledir:
grep, eşleşen satırları bulurstdout ile dışarı çıkarwc -l, gelen satırları sayarBu mantık, daha uzun komut zincirlerinde de aynı şekilde çalışır.
stdout TaşırÖnemli nokta şudur:
| yalnızca standart çıktıyı taşır.
Hata akışı, ayrıca yönlendirilmedikçe pipe içine girmez.
Örnek:
Burada wc -l, yalnızca normal çıktıyı sayar. Hata mesajı ise terminale ayrı yoldan gelir.
Hata akışını da aynı boru hattına katmak istersek önce stderr ile stdout birleştirilir:
Bu kez iki satır da wc -l tarafından görülür:
Böylece pipe yalnızca normal veriyi değil, birleştirilmiş akışı işler.
/dev/nullBazen bir akışı tamamen yok saymak isteriz. Bu amaçla /dev/null kullanılır.
Yaygın kullanımlar:
Örnek:
Bu komutta hata oluşur; fakat ekranda görünmez.
tee Ne İşe Yarar?tee, veriyi tek yere değil iki yöne gönderir:
Örnek:
Burada:
sort veriyi sıralartee, bu çıktıyı hem ekranda gösterir hem sirali.txt dosyasına yazaruniq komutuna da giderBu yüzden tee, ara sonucu kaydetmek istediğiniz durumlarda kullanışlıdır.
Normal çıktıyı dosyaya yazar.
Normal çıktıyı dosyanın sonuna ekler.
Dosyayı standart girdi olarak verir.
Hata mesajlarını ayrı dosyaya yazar.
Normal çıktı ve hata aynı dosyaya gider.
komut1 çıktısı komut2 girdisi olur.
/etc dizininin hemen içindeki dosya ve dizinlerin sayısını bulun.
Yalnızca /etc altında görünen öğeleri sayın; alt dizinlerin içeriğini dahil etmeyin.
emails.txt dosyasındaki tekrar eden satırları ayıklayın ve her satırın yalnızca bir kez geçtiği sonucu benzersiz.txt dosyasına yazın.
Hata mesajı üreten bir komut çalıştırın.
Bu hata mesajı ekranda görünmesin; yalnızca hata.txt dosyasına yazılsın.
isimler.txt dosyasındaki satır sayısını iki farklı biçimde bulun:
önce dosya adını doğrudan komuta vererek, sonra aynı dosyayı standart girdi olarak kullanarak.
/etc/passwd dosyasında /bin/bash ifadesi geçen satırların sayısını bulun.
/etc/passwd dosyasının satırlarını sıralayın.
Sonucu hem ekranda gösterin hem de aynı anda sirali.txt dosyasına yazın.
Aşağıdaki iki komutun farkını açıklayın:
Düşünmeniz gereken noktalar:
Bu soru, stderr, 2>&1 ve pipe ilişkisini birlikte düşünmenizi sağlar.
/etc/passwd dosyasından kullanıcı adlarını okuyup her kullanıcı için home dizini boyutunu hesaplayan ve sonucu kullanici_boyutlari.txt dosyasına yazan bir çözüm tasarlayın.
Bu soru önceki sorulara göre daha zordur. Tek parça düşünmek yerine adımlara ayırın: