Belge

Linux’ta ‘> /dev/null 2>&1’ nedir

/dev/null, Linux’ta programlardan gelen çıktıları, özellikle de komut satırında yürütülenleri atmak için kullanılan bir sözde aygıt dosyasıdır. Bu dosya bir havuz, yani yazılabilen bir hedef dosya gibi davranır, ancak bu dosyaya herhangi bir veri akışı yazılır yazılmaz hemen silinir.

Bu, kullanıcı tarafından gerekli olmayan çıktıdan kurtulmak için kullanışlıdır. Programlar ve süreçler, çok büyük uzunlukta çıktı günlükleri oluşturabilir ve günlüğü analiz etmek zaman zaman karmaşık hale gelir.

Örneğin, bazen bir program tarafından iki hata atılır, ancak hata günlükleri yüzlerce bilgi mesajı günlüğü arasında bir yerde kaybolur. Böyle bir durumda bilgi mesajı günlüklerini /dev/null dizinine atabiliriz.

Yukarıdaki örnekte, bir programın hata çıktısına Linux’ta STDERR (Standart Hata) denir ve ‘2’ tamsayısıyla temsil edilirken, başarı ve bilgi çıktısı STDOUT (Standart Çıktı) olarak adlandırılır ve tamsayı ile temsil edilir. ‘1’.

Şimdi, hem STDERR hem de STDOUT’u /dev/null’a atan aşağıdaki komut satırı ifadesini çok sık görmüş olabilirsiniz.

$ command_name > /dev/null 2>&1

Bunun ne anlama geldiğini anlamaya çalışalım.

>‘ operatörüne yeniden yönlendirme operatörü denir. Çıktıyı, terminalde yazdırmak yerine, bu durumda /dev/null olan kendisinden sonra belirtilen dosyaya yönlendirir.

Bu, komutun TÜM çıktısının ‘>’ operatörüyle /dev/null öğesine yeniden yönlendirildiği anlamına mı geliyor? Hayır. Yukarıda gösterildiği gibi kullanıldığında, operatör yalnızca STDOUT’u yeniden yönlendirir.

Bu nedenle, komutun son kısmına sahibiz. ‘2>&1’ şu anlama gelir: STDERR (2)’yi STDOUT (1)’e yönlendirin. Yalnızca ‘1′ yerine ‘&1‘ belirtmemizin nedeni, yalnızca ‘1’ yazmanın çıktıyı ‘1’ adlı bir metin dosyasına yönlendirmesidir. Ve işareti (&) ile sistem, 1’in bir dosya adı değil, STDOUT dosya tanımlayıcısı olduğunu tanır.

Böylece, STDOUT’u /dev/null’a ve STDERR’yi STDOUT’a yönlendiririz ve bu şekilde, program(lar)ın tam çıktısı /dev/null’da atılır.

Örneğin, mv komutunu ‘>/dev/null 2>&1’ ile ve bunlar olmadan çalıştıralım.

Yönlendirme olmadan:

$ mv tmp.txt test/tmp2.txt /tmp

STDOUT’un yeniden yönlendirilmesiyle:

$ mv tmp.txt test/tmp2.txt /tmp > /dev/null

STDOUT ve STDERR’nin yeniden yönlendirilmesiyle:

$ mv tmp.txt test/tmp2.txt /tmp > /dev/null 2>&1

Yazının orijinalini buradan okuyabilirsiniz.