STDERR öncesi STDOUT'lar gösterilsin mi?


9

Ben bash için yeniyim ve hayatım boyunca belirli bir komutu nasıl çalıştıracağımı, ./fffstderr'den önce düzenli stdout'ları nasıl bastıracağımı ve basamayacağımı anlayamıyorum (kendim anlamı hakkında kafam karıştı)

Örneğin

$ printf "I am a\ndrill\n" > fff; 
$ cat fff nofile fff nofile fff

I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill

aşağıdaki gibi yazdırmanız gerekir:

I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory

Çıktımı önce bir dosyaya yeniden yönlendirmem gerektiğini ve sonra hatayı aynı dosyaya eklemem gerektiğini anlıyorum, ancak bu benim için çıktı

$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see 

I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory

2
Did catgerçekten "bir" "bazı" tarafından yerine?
Dmitry Grigoryev

oh dang ipi batırmış olabilirim. @DmitryGrigoryev
MeOw

Yanıtlar:


18

Sonunda görüntülemek için stderr çıkışını yine de bir yerde tutmanız gerekir .

Bir dosya akla geliyor:

fff 2> file; cat file >&2

Ya hafıza (burada kullanarak spongeitibaren moreutils):

{ fff 2>&1 >&3 3>&- | sponge >&2 3>&-; } 3>&1
  • {...} 3>&1: {...}dosya tanımlayıcı (fd) içinde 3 orijinal stdout ile aynı kaynağa işaret eder (böylece stdout'u geri yüklemek için kullanabiliriz fff).
  • fff <redirs> | sponge <redirs>, fffve 'stdout bir boruya gidiyor ve aynı zamanda borunun diğer ucu olmakla birlikte sponge( <redirs>bağımsız olarak uygulanır) başladı .fffsponge
  • 2>&1: fd 2 fff(stderr), 1 ile aynı şeye işaret eder: bu noktada boru, bu yüzden fffhata spongeo boru üzerinden gider .
  • >&3: şimdi stdout orijinal stdout'u gösteriyor (eski haline geri yönlendir)
  • 3>&-: fffihtiyaç duymayan fd 2'yi kapatıyoruz
  • spongegirdisini biriktirir ve yalnızca >&2stdininde eof'i algıladıktan sonra (stdutta fffsonlandırıldığı ve zaten tüm çıktısını yazdığı varsayılarak) yalnızca stderr ile aynı kaynağa yönlendirilen stdout'unda görüntüler .

Yüklü değilse sponge, ile değiştirebilirsiniz perl -0777 -pe ''. İle -pe '', perlgirişinden her seferinde bir kayıt okur ve stdout'ta yazar. -0777(bu durumda yalnızca bir tane) kaydın tüm girdi olduğu slurp modudur.


Lütfen zamanınız varsa onu yıkın!
George Udosen

... teeyerine kullanabilir miyiz sponge?
George Vasiliou

@GeorgeUdosen bkz. Düzenleme.
Stéphane Chazelas

1
@GeorgeVasiliou, teeveri tutmaz, okur yazmaz yazar.
Stéphane Chazelas

2
@ MeOw: Bu iyi, ama Stéphane'nin cevabının üçüncü satırının gösterdiği gibi, stdout'u kurtarmanıza gerek yok; sadece yap cat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt. (Ve muhtemelen t kullanmak istemiyorum >>.) Ayrıca, Stéphane muhtemelen yapması gerektiğini mükemmel bir noktaya değinmiş cat ferr.txt >&2stderr bilgilerini yazmak için hiç stderr'e.
G-Man, 'Monica'yı Yeniden
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.