Tee kullanarak dosyaya STDERR ve STDOUT yakalama


16

Ben en iyi şekilde sıralamayı yakalanmasına da ne olduğunu anlamış değilim STDERRve STDOUTkullanarak aynı dosyaya tee. Bir dosyaya yöneltmek istersem, yönlendirmeden sonra dosya tanıtıcısını eşlemem gerektiğini biliyorum.

find . >/tmp/output.txt 2>&1

Bu göndermeye kabuk talimatını STDOUTiçin /tmp/output.txtve daha sonra göndermek STDERRiçin STDOUT(şimdi gönderirken hangi /tmp/output.txt).

2>&1Dosyayı yeniden yönlendirmeden önce gerçekleştirilmeye çalışılmasının istenen etkisi olmaz.

Ancak ben boru kullanarak istediğiniz zaman teeolması gerekir:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?

Yanıtlar:


19

İkincisi; orijinal komutun STDOUT ve STDERR'lerinin aynı fd'ye gitmesini sağlar, sonra bunları birlikte tee'ye besler. Önceki durumda, STDOUT ile birleştireceğiniz tee komutunun STDERR'ı.


5
İlginç bir şekilde bash man sayfası, " |&Kullanılırsa, standart command1 hatası, command2'nin standart girişine boru yoluyla bağlanır; bunun kısaltmasıdır 2>&1 |. Standart hatanın bu dolaylı yönlendirmesi, komut tarafından belirtilen herhangi bir yeniden yönlendirmeden sonra gerçekleştirilir."
PP.

Ben hem yazar küçük bir C programı oluşturmak zorunda kaldı stderrve stdoutbu sorunu anlamak için. Her iki çıkış akışını yakalamaya çalışırken yönlendirme >ve tee |operatörleri farklıdır. Yönlendirme için mecburdum ./testapp > /tmp/out.log 2>&1. Oysa tee için yapmak zorundaydım ./testapp 2>&1 | tee /tmp/out.log.
Typelogic

@daixtr değeri için |normalde bir boru operatörü olarak adlandırılır. teesadece borunun uzak ucunda çağrılan belirli bir programı ifade eder.
MadHatter
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.