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 (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:
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:
linux:~$ ls -al > liste
linux:~$ 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
linux:~$
> 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ır)
$ touch ~/deneme/gecici (gecici isimli bir dosya yaratır)
$ cat ~/deneme 2>oku2 >oku1
Kabuk, standart çıktı ve standart girdi için sırayla 2 ve 1 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ügü 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.