Programlama dilleri ya da script dilleri kullanırken bazı deyim’ler (idiom) kullanılmaktadır. Shell Script tarafında da bu tür kalıp deyimler karşımıza çıkıyor. Örneğin; “2>&1” sıklıkla karşımıza çıkan ama çok iyi anlaşılamayan bir deyim.
Örneğin,
1 |
ls /root > /dev/null 2>&1 |
Özetle linux conole komut yapısını anlamak için ufak bir açıklamada bulunmak isterim. Temelini anlatıp detaya girersek daha verimli olacağını düşünüyorum:
Örnek komut:
1 |
du -ah ~ | sort -rh | head -n5 |
- “ du -ah ~ ” komutu ile ~ dizini (home dizini) altındaki dosya büyüklüklerini görmek istiyoruz.
- “ sort -rh ” komutu ile bu çıktıların dosya boyutunu büyükten küçüğe sıralıyoruz. “-r” reverse; büyükten küçüğe; “ -h ” human-numeric-sort; okunabilir dosya boyutu formatına (M(megabyte), G(gigabyte)) göre.
- “ head -n5 ” komutu ile bu çıktılardan sadece üstten 5 adedini gösteriyoruz.
Anlatmak istediğim konu şu, “ du -ah ” çıktısını ekrana basmadan, “|” simgesinin sağına aktarıyoruz. Sıraya diziyoruz. Sonrasında sıralı olan listeyi yine “|” simgesinin sağına atıyoruz; baştan 5 adetini alıyoruz. Sonra sağda başka “|” olmadığı için artık ekrana basıyoruz.
Şimdi baştaki konuya dönecek olursak “|” yerine “>”, “>>” veya “<“, “<<” simgeleri de görebiliriz. Bu simgeler ise içeriğin aktarılacağı yönü ifade ediyor.
Konumuza dönelim;
I/O Redirection (Girdi/Çıktı (Input/Output) Yönlendirme)
Standart Output (stdout)
1 2 3 4 |
$ cat /root/abc.txt elma armut muz |
1 2 3 4 5 |
$ cat /root/abc.txt > cikti.txt $ cat cikti.txt elma armut muz |
“
cat /root/abc.txt ” komutu, “
/root/ ” dizini altındaki “
abc.txt ” dosyasının içeriğini ekrana basıyor.
“>” bu içeriği ekrana değil, bir dosyaya yönlendiriyor. Burada “Standart Output” (stdout) olarak ekranı değil, bir dosyayı hedeflemiş oluyoruz.
Burada standart çıktı dosyaya basılıyor; ekrana bir çıktı düşmüyor. Peki ya hata ile karşılaşırsak?!
Standart Error (stderr)
1 2 |
$ cat /root/xyz.txt > cikti.txt cat: /root/xyz.txt: No such file or directory |
Burada hata ile karşılaşınca bu çıktı ekrana yansıyor.
Gelelim konunun özetine; eğer standart output söz konusu ise bunun id’si 1, standart error söz konusu ise bunun id’si 2 olarak tanımlanmış durumda.
Yani:
Standart çıktı –>
1>
Standart hata –>
2>
Örneklersek;
1 2 |
cat /root/abc.txt 1> cikti.txt cat /root/xyz.txt 2> hata.txt |
1 2 3 4 |
$ cat cikti.txt elma armut muz |
1 2 |
$ cat hata.txt cat: /root/xyz.txt: No such file or directory |
Şimdi anlaşılacağı üzere; normal çıktılar cikti.txt dosyasına, hatalı çıktılar ise hata.txt dosyasına yazıldı. Bunu normal bir operasyon çıktılarını yönlendirmek için kullandığımız düşünülürse, hata logları ayrı, standart loglar ayrı dosyaya yazılacak.
2>&1 ifadesine gelecek olursak, stderr çıktısını, stdout çıktısının bulunduğu yere yönlendirecek demektir.
1>&2 ifadesi ise, tam tersi şeklinde çalışacaktır.
Özetle her iki durum çıktısını da aynı dosyaya yazdırmamızı sağlar ve ekrana bir çıktı vermek yerine tüm çıktıyı; standart veya hata ayırmaksızın ilgili dosyaya yazdırır.
İlk örnekte bahsettiğimiz konuya gelirsek,
ls /root > /dev/null 2>&1
ls /root çıktısını “
/dev/null ” yani bulunmayan bir dosyaya yazdırıyoruz ama bunu tüm standart out ve error durumları için yapıyoruz.
Bir kod ya da komut çıktısını sessizce çalıştırmaya ve çıktılarını gizlemeye yarar.
Umarım anlaşılır olmuştur.