Shell Script ve Linux Console’da 2>&1 Tanımı ve Kullanımı

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.