2010-06-29 12 views
21

मैं stderr के साथ-साथ बैश के तहत दोहराए गए कमांड का stdout रखना चाहता हूं। कुछ ऐसा:stderr को stderout duplicating

$ echo "FooBar" (...) 
FooBar 
FooBar 
$ 

जहां (...) पुनर्निर्देशन अभिव्यक्ति है। क्या यह संभव है?

+0

देखें के साथ काम नहीं कर रहा [कैसे मैं कई आदेशों को stdout भेज सकते हैं?] (Http://unix.stackexchange.com/questions/28503/कैसे-कर सकते हैं-i-send-stdout-to-multi-command) –

उत्तर

41

उपयोग टी:

echo "FooBar" | tee /dev/stderr 

या का उपयोग awk/perl/अजगर मैन्युअल प्रतिकृति करने के लिए:

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

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

एसटीडीईआरआर के बाद पर्ले उदाहरण – Znik

+0

में अनइडेड कॉमा जो ओएस और पूरे शैल में अधिक पोर्टेबल है? 'टीई/देव/stderr' या' टीई> (बिल्ली> और 2) '? –

+0

मैं चाहता हूं कि उत्तरार्द्ध अधिक क्रॉस-प्लेटफार्म संगत है क्योंकि प्रत्येक distro पर 'dev/stderr' उपलब्ध नहीं है। – Qix

0

stderr पर रीडायरेक्ट करने के लिए, मैं >&2 या >/dev/stderr का उपयोग करूंगा। आउटपुट को दोहराने के लिए, मैं tee का उपयोग करूंगा। इसके बारे में दोष यह है कि एक अस्थायी फ़ाइल जरूरत है:/dev/stderr साथ

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

गलत। आपके पास बड़े प्रवाह और पूरी तरह से भरने/tmp डिवाइस प्राप्त करने का मौका है, आमतौर पर/रूट फाइल सिस्टम से जुड़ा होता है। – Znik

+0

@Znik - '/ tmp/stdout' सिर्फ एक उदाहरण है। उस फ़ाइल नाम को प्रतिस्थापित करने के लिए स्वतंत्र महसूस करें जो आपके संदर्भ में जो कुछ भी उचित है। – mouviciel

9

उपयोग प्रक्रिया प्रतिस्थापन: http://tldp.org/LDP/abs/html/process-sub.html

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

टी इस फ़ाइल में पैरामीटर और डुप्लिकेट आउटपुट के रूप में फ़ाइल नाम लेता है। प्रक्रिया प्रतिस्थापन के साथ आप फ़ाइल नाम >(cat) के बजाय एक प्रक्रिया का उपयोग कर सकते हैं और आप आउटपुट को इस प्रक्रिया से stderr >(cat >&2) पर रीडायरेक्ट कर सकते हैं।

+0

यह ओएस एक्स जैसे ऑपरेटिंग सिस्टम के लिए एक अच्छा समाधान है, जिसमें/proc फ़ाइल सिस्टम नहीं है। – 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

क्षमा करें, स्पष्टीकरण जोड़ा गया ;-) – defdefred

संबंधित मुद्दे