Neden STDERR'i / dev / null'a bu şekilde yönlendiriyorsunuz?


28

Bu bana mantıklı gelmiyor.

wibble > /dev/null 2>&1

Böyle bir şey olsaydı daha anlamlı olacağını düşünüyorum:

wibble 2>&1 > /dev/null

Diğer bir deyişle

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

Komut yeniden yönlendirme sırasının ardındaki düşünce nedir xxx > /dev/null 2>1?


6
Bu açıklamayı yararlı da bulabilirsiniz .
rozcietrzewiacz

Aslında tam olarak sorumu açıklıyor @rozcietzewiacz teşekkürler
benkimim

1
Bu sayfanın ortasında Greg'in Wiki'sinde mükemmel bir bölüm var: “Bu noktada hala kafanız karıştıysa, muhtemelen FD'lerin nasıl çalıştığı konusunda yanlış bir anlayışla başladığınız ve bu yanlış algılamayı bırakamadığınız için henüz. Endişelenmeyin - bu son derece yaygın bir yanılgıdır ve yalnız değilsiniz. … Birçok insan bir 2>&1şekilde “birleştirdiğini” veya “birbirine bağladığını” veya “evlendiğini” düşünüyor, böylece bunlardan birindeki [sonradan] yapılan değişikliklerden biri diğerine değişiklik olacak. Durum böyle değil. ”
G-Man 'Monica'yı Yeniden

Yanıtlar:


40

Yönlendirmeler soldan sağa işlenir. Yaparsan

2>&1 1> /dev/null

İlk yönlendirme, stderro sırada stdoutişaret eden akıma işaret eder (esasen sizin kimliğinizdir). stderrTakma ad yapmaz stdout.

Sonra stdoutbit kepçesine yönlendirilir. stdoutYönlendirme önceki etkilemez stderryönlendirme. stderrhala senin tty için ifade eder.

Yani:

ls file_that_doesnt_exist 2>&1 1> /dev/null

sadece terminalinizde hata mesajı yazdıracak.

bashYönlendirme dokümantasyon sayfasından açıkça bu bahseder:

Yönlendirme sırasının önemli olduğunu unutmayın. Örneğin, komut

          ls > dirlist 2>&1

hem standart çıktıyı hem de standart hatayı dosya dizinine yönlendirir, komut ise

          ls 2>&1 > dirlist

sadece standart çıktıyı dosya dizinine yönlendirir, çünkü standart çıktı standart listeye yönlendirilmeden önce standart hata standart çıktıdan kopyalanır .


3
Yay bilmecemi çözdü. Hala mantıksal olarak kafa karıştırıcı olduğunu düşünüyorum. ama ilginçtir aynı sayfada başka parçası bulundu &>/dev/nullanlam eşdeğer olduğunu/dev/null 2>&1
benkimim

1
Bahsettiğiniz sayfanın Bash Referans Kılavuzunun bir parçası olduğu vurgulanmalıdır . Açıkçası, bash açıklar . Orada bash farklı bir dünyada başka kabukları vardır ve &>ve >&(bağlamda kullanılmadığı zaman 2>&1ya >&2, vs.) bash-izm ve olmayan standart . Taşınabilir olmasını istediğiniz kabuk komut dosyalarında kullanılmamalıdırlar.
G-Man 'Reeantate Monica' Dedi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.