Tee borudan tüm çıktıyı almıyor


12

Gibi komutları yürüten bir komut dosyası var:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

Sorun muhtemelen boruda tee. Tüm çıktıyı almıyor gibi görünüyor. Uygulama son çıktığı birkaç satırdan çıktığında (genellikle ölümcül hata içerenler) eksiktir. Uygulamayı piposuz çalıştırdığımda teeçıktıları alıyorum.

Komut dosyasını tee'nin tüm çıktıların işlenmesini beklemesini nasıl zorlayabilirim?


Stdout değil, bir dosyaya tee eğer TAMAM çalışır mı?
Pilot6

Yanıtlar:


23

Ölümcül hata muhtemelen STDRD'de (1) değil, STDERR'da (2) ortaya çıkmaktadır. STDERR'ı STDOUT'a yeniden yönlendirebilirsiniz 2>&1ve ardından boru da onu yakalamalıdır.

./some_app -i $INDEX 2>&1 | tee $LOG

Üstte arabelleğe alma sorunlarınız varsa, arabelleksiz bir duruma zorlayabilirsiniz:

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG

Güzel, yaklaşıyoruz. Şimdi ölümcül hatanın yazdırıldığını görüyorum ama yine de tamamlanmadı. Hatalı çizgi sadece ortada biter ve yankı çıkışı devam eder. Tamponun yıkanması veya tamamlanması için o parçanın beklenmesi konusunda hala bir sorun var.
Ladislav Mrnka

Düzenlenen. Deneyimime göre oldukça nadir bir şey tamamen çıkış tamponları ile kayıyor ama gitmeye değer.
Oli

1
Bitti! Teşekkür ederim. Çok fazla soru soruyor olabilirim ama kimse neden diğer sürece borulama tamponlama kapatmak gerektiğini anlıyor mu?
Ladislav Mrnka

@Oli Çok iyi bir tane!
Pilot6

6

Hata mesajları normalde STDERR'de (Dosya tanımlayıcı 2) gösterildiğinden, hem STDOUT hem de STDERR'ı aşağıdakilere yönlendirmeniz gerekir tee:

./some_app -i "$INDEX" |& tee "$LOG"

Bunu yaptığınızda ./some_app -i $INDEX | tee $LOGyalnızca STDOUT'u adresine yönlendirirsiniz tee.

|& hem STDOUT hem de STDERR öğelerinin yönlendirilmesine neden olur.

Yalnızca STDOUT'u (önceki gibi) yönlendiremezseniz:

./some_app -i "$INDEX" | tee "$LOG"

Öte yandan yalnızca STDERR'ı yeniden yönlendirmek istiyorsanız:

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
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.