Standart Girdi, Çıktı ve Hata

Next: Boru (pipe) İşlemleri Up: Kabuk İşlemleri Previous: Yönlendirme

# Standart Girdi, Çıktı ve Hata

Linux'ta, programın ekrana yazılan bilgiyi 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ı. Program çalıştığı andan itibaren bu iki kanal üzerinden akan bilgiler, programın çalıştığı sanal terminale yazılırlar. Program girdilerini ise standart girdi aracı olan klavyeden alır.

Eğer bu bilgiler bir ekran boyundan (normalde 25 satır) fazla tutuyorsa bazı satırlar programcının gözünden kaçabilir. Bunu önlemek amacıyla standart çıktı ve hata bir dosyaya yazılacak şekilde ayarlanabilir. Yönlendirme olarak da bilinen bu işlem UNIX altında (DOS'ta olduğu gibi) `>` karakteri ile gerçekleştirilir.

Örnek olarak o an bulunduğunuz dizinde yeralan dosyaları ekrana getirin :

    $ ls -al

Bu komut, standart çıktı olarak dosyaların bilgilerini ekrana getirecektir. Bu çıktıyı, bir dosyaya yönlendirelim ve dosyanın içeriğine göz atalım:

    $ ls -al > liste
    $ cat liste
    total 16
    drwxr-xr-x   5 gorkem   users        1024 Feb 13 13:10 .
    drwxr-xr-x   4 root     root         1024 Jan  7  1980 ..
    -rw-r--r--   1 gorkem   users         390 Feb 13 12:56 .Xdefaults
    -rw-r--r--   1 gorkem   ftpadm       2016 Feb 13 13:09 .bash_history
    -rw-r--r--   1 gorkem   users           1 Feb 13 12:57 .bashrc
    -rw-r--r--   1 gorkem   users         163 Nov 24  1993 .kermrc
    -rw-r--r--   1 gorkem   users          34 Nov 24  1993 .less
    -rw-r--r--   1 gorkem   users         114 Nov 24  1993 .lessrc
    drwxr-xr-x   2 gorkem   users        1024 Jan  7  1980 .term
    -rw-r--r--   1 gorkem   users          87 Feb 13 12:56 .xinitrc
    -rw-r--r--   1 gorkem   users        2795 Feb 13 13:06 adres
    -rw-r--r--   1 gorkem   users           0 Feb 13 13:10 liste
    drwxr-xr-x   2 gorkem   users        1024 Feb 13 12:54 mail
    drwxr-xr-x   2 gorkem   users        1024 Feb 13 12:54 perl
    -rw-r--r--   1 gorkem   users           0 Feb 13 13:10 typescript
    $

`>` karakteri standart hatayı dosyaya yönlendirmez. Bu işlem için `2>` kullanılır. Ama hatayı görebilmek için, hata yaratan bir komut yazmalıyız, değil mi ?

    $ ls /deneme
    /deneme : No such file or directory
    $ ls /deneme 2> hata
    $ cat hata
    /deneme : No such file or directory

Aşağıdaki komutun işletilmesinin ardından standart çıktı `oku1` dosyasına, standart hata ise `oku2` dosyasına yazılacaktır. Bu dosyaları komutu çalıştırdıktan sonra incelemek suretiyle neler olup bittiğini anlamak mümkün olur.

    $ mkdir ~/deneme           (deneme isimli bir dizin yarat)
    $ touch ~/deneme/gecici    (gecici isimli bir dosya yarat)
    $ cat ~/deneme 2>oku2 >oku1

Kabuk, standart çıktı ve standart girdi için sırayla 1 ve 0 numaralarının kullanımına izin verir. Yukarıda yeralan son komutta, standart hata mesajları için 2 kullanılarak hataların `oku2` dosyasına yazılmıştır. Aşağıda, çekirdek derlemek için sürekli kullandığım program yeralıyor. Yönlendirme sayesinde ekrana gelmesi gereken mesajlar kullanılmayan 9. sanal konsola yönlendiriliyor.

    # make config
    # make dep > /dev/tty9
    # make clean > /dev/tty9
    # time make zImage > /dev/tty9

Son satırdaki `time` komutu, kendinden sonra gelen komutun ne kadar zaman içinde çalıştırıldığını gösterir. Çekirdek derlemede geçen zaman, makinanın gücü hakkında bir fikir verebilir. Peki ne hata, ne de çıktıyı ekranda görmek istemiyorsam ne yapmalıyım? Bunun için standart çıktı ve hatayı biraraya getirerek yönlendirilen her çıktının kaybolduğu ``kara deliğe'' atmak yeterlidir:

    $ ls /deneme > /dev/null 2>&1

Yukarıdaki komutun yazılış sırasına dikkat edin.

Standart çıktı ya da standart hatayı yönlendirirken, `>` işareti kullanırsanız; dosya yoksa, oluşturulur ve komutun çıktısı dosyaya yazılır. Dosya varsa, içeriği yok olur, ve komutun çıktısı dosyanın yeni içeriği olur. Var olan bir dosyayının eski içeriğini tamamen silmek değil de komutun çıktısını dosyaya eklemek istiyorsanız `>>` kullanmalısınız. Bu durumda dosya varsa komutun çıktısı dosyanın eski içeriği korunarak sonuna eklenir, dosya yoksa oluşturulur ve komutun çıktısı dosyaya yazılır. Örneğin:

    $ echo deneme1 >>deneme.txt
    $ cat deneme.txt
    deneme1
    $ echo deneme2 >>deneme.txt
    $ cat deneme.txt
    deneme1
    deneme2
    $

Örnekte görüldüğü gibi ilk komut `deneme.txt` dosyasını oluşturdu. İkincisi ise oluşan dosyanın içeriğini koruyarak ikinci komutun çıktısını bu dosyanın sonuna ekliyor.

Standart hata ve çıktıya ek olarak UNIX'in desteklediği bir yönlendirme daha vardır: Standart girdi sayesinde bir dosyayı oluşturan satırlar, bir komut veya programa yönlendirilebilir. Daha önce bir metin editor kullanarak hazırlamış olduğumuz raporu patrona kısa yoldan göndermek için,

    $ mail -s "rapor" patron < rapor.txt

Dosyanın içeriği, mail komutuna girdi olmuş ve `rapor.txt` dosyası `patron` kullanıcısına ``rapor'' konu başlığıyla e-posta ile gönderilmiştir.

Next: Boru (pipe) İşlemleri Up: Kabuk İşlemleri Previous: Yönlendirme