Bash kabuğu ile ilgili olarak hatırlamak için en iyi yolu ne olduğunu anlamaktır.
Tek yapmak istediğiniz komutu nasıl doğru alacağımı hatırlamaksa, deneyebilirsiniz
program > /results 2> /results
Neler olup bittiği ve hatırlanması kolay olan çok açık ve güzel yani
1
STDOUT gidiyor /results
2
STDERR da gidiyor doğrudan etmek/results
Sorun şu ki, beklediğiniz gibi çalışmıyor. aşağıdakileri göz önünde bulundur:
dosya: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
ve komut çalıştırmak
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
sonra
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
burada ne oldu?
Benim anlayış STDERR işaret yönlendirme bash kurulduğundan doğrudan dosyaya /tmp/results
nedeniyle doğasının >
2 şey yapar ki
- normalde yeni bir dosya oluşturun - bu durumda, bash, çıktı üretildiği sırada bash bu rutinden geçerken fırsat geçti.
- Dosyanın başına doğrudan yerleştirin. ve aynen
>>
öyle değil .
Yani bu durumda STDERR, doğrudan /tmp/results
STDOUT çıkışını geçersiz kılmanın başlangıcına yerleştirir .
Not: Eğer eklerseniz >>
eskiden muhtemelen bu sözdiziminden kurtulabilirsiniz.
Ancak sorunu düzeltmek için - STDERR'yi doğrudan dosyaya yönlendirmek için değil, STDERR'nin çıkışını STDOUT akışına birleştirmek için ihtiyacınız var, bu yüzden bir çarpışma elde edemezsiniz.
Operatör 2>&1
operatörünü kullanarak bunu başarır
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
&
Adlı bir dosyadan ayırt etmek bash sağlayan 1
ve 1
dosya tanımlayıcı.
Bana göre ifadenin 2>&1
kendisi tam olarak ne olduğunu açıklıyor - STDERR STDOUT'un kendisine yönlendiriliyor - ve sadece /tmp/results
sonuçta geliyor çünkü STDOUT'un işaret ettiği yer (neredeyse bir yan etki gibi).
Kılavuzların 2>&1
birçoğunun iddia ettiği şeyin aksine, STDERR'yi hiç STDOUT'un işaret edildiği yere gönderir. Eğer bu doğru olsaydı - hala üzerine yazma probleminiz olurdu.
Daha fazla bilgi için bkz. - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
. Bazı zamanlar gerçekte neler olup bittiğini görmek içinstdout
vestderr
birlikte karıştırmanız gerekebilir - bir dosyaya yönlendirilen karmaşık bir derleme işleminin çıktısı gibi. Bu durumda, googling sonunda