6 - Standart Girdi Çıktı ve Hata İşlemleri
2025
Öncelikle “standart” kelimesini gözardı ederek çıktıya odaklan.
Bir komut çalıştırdığınızda o komut bir şeyler üretiyor. Genellikle ürettiği şeyi ekrana yazdırıyor. Örneğin ls
komutu:
Burada ls komutu dosya ve dizin isimlerini bize çıktı olarak verdi.
ls -l
komutunu çalıştırsaydık farklı bir çıktı verecekti.
cezmi@ubuntu:~$ ls
Belgeler Genel İndirilenler Masaüstü Müzik Resimler Şablonlar Videolar
cezmi@ubuntu:~$ ls -l
toplam 32
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Belgeler
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Genel
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 İndirilenler
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Masaüstü
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Müzik
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Resimler
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Şablonlar
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Videolar
Her iki durumda da ls
komutuna, çıktıyı nereye yazacağını söylemiyoruz, bu yüzden ls
, standart olan çıktıya yazıyor (stdout). Bu durumda da standart çıktımız bizim terminal ekranımız oluyor.
GNU/Linux ve benzeri POSIX sistemlerin en güçlü olduğu yönlerden birisi, programların standart girdi ve çıktılarının yönlendirilmesidir.
UNIX sistemlerde, çıktıyı “standart olmaktan çıkarma” amacıyla, standart çıktıyı farklı bir yere yönlendirmenin faydalı olacağı görülmüştür. Örneğin ls -l
sonucunu, standart çıktı yerine yani terminal ekranı yerine bir dosyaya yönlendirebiliriz.
Farkettiyseniz ls -l
komutunun sonucunu ekranda görmüyoruz. Bunun nedeni komutun standart çıktısını ls_ciktisi
isimli dosyaya yönlendirmemiz.
ls_ciktisi
isimli dosyanın içeriğine bakarsak komutun çıktısını görebiliriz.
cezmi@ubuntu:~$ cat ls_ciktisi
toplam 32
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Belgeler
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Genel
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 İndirilenler
-rw-rw-r-- 1 cezmi cezmi 0 Nis 25 11:37 ls_ciktisi
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Masaüstü
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Müzik
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Resimler
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Şablonlar
drwxr-xr-x 2 cezmi cezmi 4096 Nis 25 11:29 Videolar
Standart çıktıyı yönlendirme işlemi >
karakteri ile yapılır.
Standart çıktı yönlendirmek için kullandığımız >
işareti, hedef dosya bulunmazsa oluşturur. Eğer hedef dosya bulunuyorsa, dosyanın içeriğini tamamen siler ve yeni sonucu yazar.
Eğer hedef dosyanın içeriğinin silinmesini istemiyorsak, ancak yeni sonucun dosyanın sonuna eklenmesini istiyorsak, bunun için >>
işaretini kullanmamız gerekir.
Biraz önceki örnekte kullandığımız çıktı dosyasının sonuna, farklı bir dizinin çıktısını da eklemek isteseydik, şöyle bir işlem yapabilirdik.
UNIX dünyasında, programların standart çıktıları gibi, standart girdileri de vardır.
Biraz önceki örnekte cat
komutu ile ls_ciktisi
isimli dosyanın içeriğini görüntülerken, okunacak veriyi standart girdi olarak sunmayıp, aslında parametre olarak gönderdik. Yani cat ls_ciktisi
yazdığımız zaman, aslında cat programı ilk parametresi olan ls_ciktisi
değerini okudu.
Eğer bu dosyayı parametrik olarak değil de, standart girdi olarak sunmak isteseydik, şöyle bir işlem yapmamız gerekirdi:
Örnekte de görüldüğü gibi standart girdiyi <
karakteriyle veriyoruz.
Eğer cat
komutunu parametresiz bir şekilde çalıştırırsanız varsayılan standart girdi olan klavyeden girdi bekler.
İşte klavyeden girdi girmeden bir dosyanın içeriğini bir komuta girdi olarak vermek için <
karakterini kullanıyoruz.
Dene: cat
ve cat > deneme
Linux’ta, komutların çıktılarını iki sınıf altında toplayabiliriz. Birincisi, olağandışı bir durumu bildiren standart hata, diğeri de her türlü verinin yazıldığı standart çıktı.
Bir komutun ürettiği hata mesajlarını, standart çıktının bir dosyaya yönlendirilmesi gibi başka bir dosyaya yönlendirebiliriz.
Örnek:
Örnekte de görüldüğü gibi standart hata mesajları bir dosyaya yönlendirilirken 2>
ifadesi kullanılmaktadır.
Buradaki 2 sistem tarafından, hataların gönderildiği dosya numarası olarak tanımlanmıştır. Yani hataların yazıldığı 2 numaralı dosyayı bizim belirttiğimiz hedefe yönlendir demiş olduk.
Hatırlarsanız her şey dosyaydı!
İlgili komutun sonuna 2>&1
eklenerek yapılır. Buradaki 1 sayısı standart çıktıların gönderildiği dosya numarasıdır.
Yani şunu demiş olduk; standart hataların yazıldığı 2 numaralı dosyanın içeriğini standart çıktıların yazıldığı 1 numaralı dosyaya yönlendir.
Örnek:
|
karakteri kullanılır.komut1 | komut2 | komut3 | komut4
diye devam edebilir.Eğer çok fazla dosya içeren bir dizin içinde ls -l
komutunu çalıştırırsak, standart çıktı içerisinde kaybolabiliriz.
less
komutunun da kendisine sağlanan bilginin terminal ekranına sığacak şekilde parçalanmasını sağladığını biliyoruz.
O halde ls -l
komutunun çıktısını less
komutuna girdi olarak verebilirsek ls -l
komutu çıktısını rahatça okuyabiliriz.
$ mkdir ~/effective-shell/new-folder | tr '[:lower:]' '[:upper:]'
mkdir: `/home/cezmi/effective-shell/new-folder' dizini oluşturulamıyor: Böyle bir dosya ya da dizin yok
$ mkdir ~/effective-shell/new-folder 2>&1 | tr '[:lower:]' '[:upper:]'
MKDiR: `/HOME/CEZMi/EFFECTiVE-SHELL/NEW-FOLDER' DiZiNi OLUşTURULAMıYOR: BöYLE BiR DOSYA YA DA DiZiN YOK
Standart çıktıyı ya da hatayı “kara deliğe” yönlendirmek istiyorsanız /dev/null
’ı kullanabilirsiniz.
Bu komut Simpsons karakterlerinin listesini sıralar, tekrarlananları kaldırır, A harfiyle başlayanları bulur ve ortasında tee komutu vardır. Bu tee
ne işe yarıyor?
tee
komutu su tesisatındaki T borusu gibidir - veri akışının iki yöne gitmesini sağlar! sorted.txt
dosyası, sıralama işleminden sonra, ancak uniq
ve grep
yani filtreleme işleminden önceki karakter kümelerini içerir. Görsel olarak bunu yapar:
emails.txt
isimli dosyanın her satırında bir email adresi yazmaktadır. benzersiz satırları bulup helehele
isimli dosyaya yazdıran komutu yazın.emails.txt
(bir önceki sorulardaki gibi, her satırında bir e-posta adresi olan bir dosya) dosyasındaki tüm satırları, @ karakterinden önceki ve sonraki kısımlar olarak ikiye ayırın (Örn: [email protected] -> kullanici ve example.com). Bu iki kısmı ayrı ayrı dosyalara kaydedin.foo
isimli dosyanın içerisinde kaç satırda test
kelimesi geçtiğini bulan komutu yazın./etc/passwd
dosyasından çekip, bu kullanıcıların her birinin home dizininin boyutunu (alt dizinler dahil) hesaplayın ve kullanıcı adı - boyut şeklinde kullanici_boyutlari.txt dosyasına yazdırın.