Çıktının stdout veya stderr olup olmadığını belirleme


22

Bir işlemin çıktısının stdout mu yoksa stderr mi olduğunu nasıl belirleyebilirim?

Yanıtlar:


22

Bir programın STDOUT'a ne vereceğini ve STDERR'a ne vereceğini belirlemenin yalnızca üç yolu vardır

  1. Dokümanları okuyun. Veya

  2. Yeniden yönlendirme ile deneme †

  3. kırmızı STDERR yazdır

†Örneğin:

program > program.stdout 2> program.stderr

Ardından, programın STDOUT'a ne yazdığını ve STDERR'a ne yazdığını görmek için iki çıktı dosyasına bakın.

Yeniden yönlendirme yerine, teehem ekrana hem de bir dosyaya devam etmek için çıktıya ihtiyacınız varsa yönlendirebilirsiniz . Bkz. Https://stackoverflow.com/q/692000/477035


15
Genellikle 3. seçenekte bir varyasyon kullanırım: program | grep .STDOUT'u kırmızı yazdırır.
Dennis

Kırmızıya basmak tam olarak aradığım şeydi. Teşekkürler RedGrittyBrick & Dennis
Rauffle

7

Yorumladığınız talebe dayanarak:

{ { command; } 2>&3 | sed 's/^/STDOUT: /'; } 3>&1 1>&2 | sed 's/^/STDERR: /'

3
Etkileyici görünüyor. Ama kirazları ağacınıza ekleyip ne yaptığını açıklar mısınız? Buradaki herkes bir guru değil - ve yapınız biraz karmaşık;)
Izzy

Parantezler sipariş içindir. Aslında bu formu I-unut-nereden aldım, ama nokta iç parantez kümesinin çıktısını almak için ekstra dosya tanımlayıcıları (1 = stdoutve 2 = dışında stderr) kullanmak ve giderken stdoutbir sedkomutla çalıştırmaktır. stderrfarklı bir tane.
zebediah49

Vay. Bu ekstra tanımlayıcıları kullanmayı bilmiyordum. İlk önce biraz kafam karıştı (koştuğumu anlamak istiyorum - ve kıvırcık parantezlerle biraz karıştı). Ama şimdi açık - ve IMHO OP'nin tam olarak ne istediğini. Yani benden +1 :)
Izzy

Bu bana yardımcı oldu. Stderr'a daha fazla veri eklemek istedim. Bunu yapar ve her şeyi stdout / stderr üzerine düzgün bir şekilde çıkarır. { { { { echo "stdout" ; echo "stderr">&2; } 2>&3; } 3>&1 1>&2 | awk '{print "ERROR:",$0}' 1>&3; } 3>&2 2>&1; }
Bryan Drewery

0

Stderr dosyasını bir dosyaya yeniden yönlendirebilirsiniz ve içinde bir şey varsa, stderr'den gelir.

Örneğin ls -a 2> ls-all.txt

stderr'a herhangi bir nedenle gönderilen bir hata varsa, bu dosyaya yönlendirilecektir.


-1

Bunu bir defaya mahsus yapmak istiyorsanız, bunlardan birini başka bir yere yönlendirin.

Örnek, ile standart yeniden yönlendirme >.

ls -al> ls-l.txt (burada herhangi bir çıktı stdout'tan değildir, eğer bir şey görürseniz stderr çıktısı olmalıdır)

Stderr yönlendirmesi kullanımı için 2>


İşlem, bazıları stderr'a stdout olmak için sabit bir çıktı akışı oluşturur. Hangi çıktının ekrana gideceğini belirlemek istiyorum
Rauffle
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.