Belge

Shell Script 2>&1 ne anlama gelir?

Bir programlama veya betik dili ile çalışırken, sürekli olarak bazı deyimler, bu şekilde yapılan bazı şeyler, bir sorunun ortak çözümü olarak kullanırız. Shell Script ile de bu farklı değildir ve oldukça yaygın, ancak çok iyi anlaşılmayan bir deyim, 2>&1’dir, tıpkı aşağıdaki gibi
ls foo > /dev/null 2>&1.
Burada neler olup bittiğini ve bunun neden bu şekilde çalıştığını açıklamamıza izin verin.

G/Ç yeniden yönlendirmesine hızlı bir giriş

Basitçe söylemek gerekirse, yeniden yönlendirme, bir komutun çıktısını başka bir yere göndermek için kullanılan mekanizmadır. Örneğin, sadece bir dosyayı cat yaparsak, çıktısı varsayılan olarak ekranda yazdırılacaktır:

$ cat foo.txt
foo
bar
baz

Ancak bu çıktıyı başka bir yere yönlendirebiliriz. Burada örneğin onu output.txt adlı bir dosyaya yönlendiriyoruz:

$ cat foo.txt > output.txt

$ cat output.txt
foo
bar
baz

İlk cat ekranda herhangi bir çıktı görmediğimize dikkat edin. Standart çıktı (stdout) konumunu bir dosya olarak değiştirdik, böylece artık ekranı kullanmıyor.

Programların hata mesajlarını gönderebilecekleri standart hata (stderr) adı verilen başka bir yerin olduğunu bilmek de önemlidir. Öyleyse, var olmayan bir dosyayı cat ile görüntülemeye çalışırsak, bunun gibi bir sonuçla karşılaşırız:

$ cat nop.txt > output.txt
cat: nop.txt: No such file or directory

Stdout’u bir dosyaya yönlendirsek bile ekranda yine hata çıktısını görüyoruz çünkü standart hatayı değil sadece standart çıktıyı yönlendiriyoruz.

Ve dosya tanımlayıcılara hızlı bir giriş

Bir dosya tanıtıcı, açık bir dosyayı temsil eden pozitif bir tam sayıdan başka bir şey değildir. 100 açık dosyanız varsa, bunlar için 100 dosya tanıtıcınız olacaktır.

Tek uyarı, Unix sistemlerinde her şeyin bir dosya olmasıdır. Ancak bu artık gerçekten önemli değil, sadece Standart Çıktı (stdout) ve Standart Hata (stderr) için dosya tanımlayıcıları olduğunu bilmemiz gerekiyor.

Sade İngilizce olarak, bu iki konumu tanımlayan “id’ler” olduğu anlamına gelir ve her zaman stdout için 1 ve stderr için 2 olacaktır.

Parçaları bir araya getirmek

İlk örneğimize dönersek, cat foo.txt çıktısını output.txt’ye yönlendirdiğimizde, komutu şu şekilde yeniden yazabiliriz:

$ cat foo.txt 1> output.txt

Bu 1 sadece stdout için dosya tanımlayıcıdır. Yönlendirme için sözdizimi [FILE_DESCRIPTOR]> şeklindedir, dosya tanıtıcıyı dışarıda bırakmak sadece 1> kısayoludur.

Bu nedenle, stderr’yi yeniden yönlendirmek için doğru dosya tanıtıcıyı yerine eklemek yeterli olmalıdır:

# Using stderr file descriptor (2) to redirect the errors to a file
$ cat nop.txt 2> error.txt

$ cat error.txt
cat: nop.txt: No such file or directory

Bu noktada muhtemelen 2>&1 deyiminin ne yaptığını zaten biliyorsunuzdur, ama hadi bunu resmileştirelim.

Dosya tanımlayıcı 1’in (stdout) değerine başvurmak için &1’i kullanırsınız. Yani 2>&1 kullandığınızda, temelde “stderr’yi stdout’u yönlendirdiğimiz yere yönlendirin” diyorsunuz. İşte bu yüzden hem stdout’u hem de stderr’yi aynı yere yönlendirmek için böyle bir şey yapabiliriz:

$ cat foo.txt > output.txt 2>&1

$ cat output.txt
foo
bar
baz

$ cat nop.txt > output.txt 2>&1

$ cat output.txt
cat: nop.txt: No such file or directory

özet

  • Programların çıktı gönderdiği iki yer vardır: Standart çıktı (stdout) ve Standart Hata (stderr);
  • Bu çıktıları farklı bir yere (dosya gibi) yönlendirebilirsiniz;
  • Dosya tanımlayıcıları, stdout (1) ve stderr’yi (2) tanımlamak için kullanılır;
  • komut > çıktı, yalnızca komut 1> çıktı için bir kısayoldur;
  • Bir dosya tanıtıcı değerine başvurmak için &[FILE_DESCRIPTOR] kullanabilirsiniz;
  • 2>&1 kullanmak, stderr’yi stdout olarak ayarlanan değere yönlendirir (ve 1>&2 tersini yapar).

Yazının orijinalini buradan okuyabilirsiniz.