2010-06-29 8 views
21

ben bash altında yanı stderr çoğaltılan bir komutun stdout'unu olsun isterim stderr. Bir şey gibi (0) yeniden yönlendirme ifadesidir. Mümkün mü?Kopyalama-stdout'u

+0

See çalışıyor ile çalışmıyor [Birden komutlara stdout'u gönderebilir nasıl?] (Http://unix.stackexchange.com/questions/28503/nasıl-can-ı-send-stdout-to-çoklu komutları) –

cevap

41

Kullanım tee:

echo "FooBar" | tee /dev/stderr 

veya el çoğaltma yapmak awk/perl/python kullanın:

echo "FooBar" | awk '{print;print > "/dev/stderr"}' 

echo "FooBar" | perl -pe "print STDERR, $_;" 
+1

STDERR'den sonra, OSL ve Kabuklar arasında daha taşınabilir olan – Znik

+0

numaralı gereksiz virgül? 'tee/dev/stderr' veya' tee> (kedi> & 2) '? –

+0

Bahse girerim ki, ikincisi, her dağıtımda '/ dev/stderr' nin mevcut olmadığı şekilde daha iyi platformlar arası uyumludur. – Qix

0

stderr'e yönlendirme için, ben >&2 veya >/dev/stderr kullanmak. Çıktının çoğaltılması için tee kullanırdım. Bunun dezavantajı geçici dosya gerektiği yönünde:/dev/stderr'e ile

echo "FooBar" | tee /tmp/stdout >&2 ; cat /tmp/stdout 
+0

yanlış. Genellikle/root dosya sistemine bağlı büyük bir akış ve tam olarak doldurma/tmp cihazı alma şansınız olur. – Znik

+0

@Znik - '/ tmp/stdout' sadece bir örnektir. Bu dosya adını, içeriğinizde daha uygun olan herhangi bir şeyle değiştirmekten çekinmeyin. – mouviciel

9

kullanımı işlemi ikame: http://tldp.org/LDP/abs/html/process-sub.html

echo "FooBar" | tee >(cat >&2)

Tee bu dosyaya parametre ve çiftleri çıktı olarak bir dosya adı alır. süreç ikamesi ile yerine dosya >(cat) sürecini kullanabilir ve >(cat >&2) stderr bu süreçten çıkış yönlendirebilirsiniz.

+0

Bu,/proc dosya sistemine sahip olmayan OS X gibi işletim sistemleri için iyi bir çözümdür. – Meow

-1
echo "FooBar" |tee /dev/stderr 
tee: /dev/stderr: Permission denied 

RedHat 6,3

echo "FooBar" | (read A ; echo $A ; echo $A >&2) 

+0

Üzgünüm, açıklama eklendi ;-) – defdefred