Açık Kaynak İşletim Sistemleri

6 - Standart Girdi Çıktı ve Hata İşlemleri

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2025

İçerik

  • Standart Girdi Çıktı ve Hata
  • Yönlendirme
  • Pipe İşlemleri

Standart Girdi ve Çıktı

Standart Çıktı (stdout)

  • Ö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:

cezmi@ubuntu:~$ ls
Belgeler  Genel  İndirilenler  Masaüstü  Müzik  Resimler  Şablonlar  Videolar

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.

Yönlendirme

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.

cezmi@ubuntu:~$ ls -l > ls_ciktisi

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

> ve >>

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.

cezmi@ubuntu:~$ ls -l /etc >> ls_ciktisi
cezmi@ubuntu:~$ cat ls_ciktisi
...

Standart Girdi (stdin)

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:

cezmi@ubuntu:~$ cat < ls_ciktisi
...
cezmi@ubuntu:~$ sort < /etc/shadow
...

<

Ö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

Standart Hata (stderr)

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:

$ ls /deneme
ls: '/deneme''e erişilemedi: Böyle bir dosya ya da dizin yok

$ ls /deneme > hata
ls: '/deneme''e erişilemedi: Böyle bir dosya ya da dizin yok

$ cat hata

$ ls /deneme 2> hata

$ cat hata
ls: '/deneme''e erişilemedi: Böyle bir dosya ya da dizin yok

Ö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ı!

$ ls -al /dev/std*
lrwxrwxrwx 1 root root 15 Nis 24 09:26 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Nis 24 09:26 /dev/stdin  -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Nis 24 09:26 /dev/stdout -> /proc/self/fd/1

Standart Hatayı Standart Çıktıya Yönlendirme

İ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:

$ touch test

$ ls test mest > liste
ls: 'mest''e erişilemedi: Böyle bir dosya ya da dizin yok

$ cat liste
test

$ ls test mest > liste 2>&1
cat liste
ls: 'mest''e erişilemedi: Böyle bir dosya ya da dizin yok
test

Kanallama İşlemleri (Ardışık Komutlar)

  • Bazı durumlarda, bir komutun çıktısı diğer bir komuta girdi olarak verilmek istenebilir.
  • Başka bir deyişle, komutun standart çıktısını bir dosyaya değil, bu çıktıyı işleyecek başka bir komuta yönlendirmek isteyebiliriz.
  • Bu amaçla boru (pipe) | karakteri kullanılır.
  • Bu karakter, kendinden önce gelen komut veya komut serisinin çıktısını, kendinden sonra gelen komuta gönderir.
  • komut1 | komut2 | komut3 | komut4 diye devam edebilir.

Örnek

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.

cezmi@ubuntu:~$ ls -l /etc | less
toplam 1108
drwxr-xr-x  3 root root    4096 Şub 23 11:50 acpi
-rw-r--r--  1 root root    3028 Şub 23 11:47 adduser.conf
drwxr-xr-x  3 root root    4096 Şub 23 11:48 alsa
drwxr-xr-x  2 root root    4096 Mar 14 12:47 alternatives
-rw-r--r--  1 root root     401 Tem 16  2019 anacrontab
...

Örnekler

$ sort a.txt | uniq
101
Academy
business
Linux
pardus
cat beni.oku | wc –l
3
# komut çıktısında bul
ps ax | grep 'kelime'
dpkg --list | grep 'vim'
$ echo "iyi gunler" | sed 's/gun/gece/g'
iyi geceler

Örneklere devam…

$ 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

/dev/null

Standart çıktıyı ya da hatayı “kara deliğe” yönlendirmek istiyorsanız /dev/null’ı kullanabilirsiniz.

mkdir ~/effective-shell/new-folder 2>/dev/null

Son Bir Numara - T Borusu (T Pipe)

cat ~/effective-shell/text/simpsons-characters.txt | sort | tee sorted.txt | uniq | grep '^A'

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:

Çalışma soruları

  • /etc dizininde (alt dizinler hariç) kaç dosya ve dizin olduğunu bulan komutu yazın.
  • Kullanıcının ev dizinindeki en büyük 3 dosyayı listeleyin.
  • 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.
  • Kullanıcının ev dizinindeki foo isimli dosyanın içerisinde kaç satırda test kelimesi geçtiğini bulan komutu yazın.
  • Sistemdeki tüm kullanıcıların adları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.