stderr (Standard Error)
Şimdi biraz farklı bir şey deneyelim. Sisteminizde olmayan bir dizinin içeriğini listelemeye çalışalım ve çıktıyı yine peanuts.txt dosyasına yönlendirelim.
$ ls /fake/directory > peanuts.txtBu komutu çalıştırdığınızda ekranda aşağıdaki gibi bir mesaj görmelisiniz:
ls: cannot access /fake/directory: No such file or directoryMuhtemelen şu anda, bu mesajın dosyaya yazdırılması gerektiğini düşünüyorsunuz. Aslında burada devreye giren başka bir I/O akışı var: standart hata (stderr). Standart çıktı (stdout) akışından tamamen farklı olan standart hata akışı, varsayılan olarak çıktısını da ekrana gönderir. Yani, standart hata çıktısını farklı bir şekilde yönlendirmeniz gerekir.
Ne yazık ki, standart hata yönlendirme sembolleri (< veya >) kadar kolay değildir, ancak dosya tanımlayıcıları kullanılarak yapılabilir. Bir dosya tanımlayıcısı, bir dosyaya veya akışa erişmek için kullanılan negatif olmayan bir sayıdır. Dosya tanımlayıcıları hakkında daha sonra daha ayrıntılı bilgi edineceğiz, ancak şimdilik standart giriş (stdin), standart çıktı (stdout) ve standart hata (stderr) için dosya tanımlayıcılarının sırasıyla 0, 1 ve 2 olduğunu bilmeniz yeterli.
Şimdi standart hata çıktısını dosyaya yönlendirmek istiyorsak şöyle yapabiliriz:
$ ls /fake/directory 2> peanuts.txtBu komutta, standart hata mesajlarını peanuts.txt dosyasına yazdırmış olduk.
Peki hem standart hata hem de standart çıktıyı peanuts.txt dosyasına yazdırmak istersek ne yapabiliriz? Bunu da dosya tanımlayıcıları ile yapabiliriz:
$ ls /fake/directory > peanuts.txt 2>&1Bu komut, ls /fake/directory komutunun sonuçlarını peanuts.txt dosyasına gönderir ve ardından 2>&1 ile standart hatayı standart çıktının yönlendirildiği yere yönlendirir. İşlem sırası burada önemlidir. 2>&1, standart hatayı standart çıktının işaret ettiği yere gönderir. Bu durumda standart çıktı bir dosyaya işaret ettiğinden, 2>&1 de standart hatayı bir dosyaya gönderir. Yani peanuts.txt dosyasını açarsanız, hem standart hata hem de standart çıktı mesajlarını görmelisiniz. Yukarıdaki komut yalnızca standart hata çıktısı ürettiği için her ikisini de görmeyebilirsiniz.
Hem standart hata hem de standart çıktıyı bir dosyaya yönlendirmenin daha kısa bir yolu vardır:
$ ls /fake/directory &> peanuts.txtPeki tüm bu gereksiz hata mesajlarından kurtulmak ve standart hata mesajlarını tamamen yok saymak istersek ne yapabiliriz? Çıktıyı /dev/null adlı özel bir dosyaya yönlendirebilirsiniz. Bu dosya, herhangi bir girişi yok sayar.
$ ls /fake/directory 2> /dev/nullLast updated