Site icon Verba Volant, Scripta Manent

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.

Exit mobile version