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,
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:
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)
$ cat /root/abc.txt
elma
armut
muz
$ 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)
$ 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;
cat /root/abc.txt 1> cikti.txt
cat /root/xyz.txt 2> hata.txt
$ cat cikti.txt
elma
armut
muz
$ 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.