बैश में स्टडआउट और स्टेडर दोनों को पाइप करना?


156

ऐसा लगता है कि बैश के नए संस्करणों में &>ऑपरेटर होता है, जो (अगर मैं सही तरीके से समझता हूं), एक फ़ाइल में stdout और stderr दोनों को रीडायरेक्ट करता है ( &>>एड्रियन स्पष्ट किए गए अनुसार फ़ाइल में जोड़ता है)।

एक ही चीज़ को प्राप्त करने का सबसे सरल तरीका क्या है, लेकिन इसके बजाय किसी अन्य कमांड को पाइप करना?

उदाहरण के लिए, इस पंक्ति में:

cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError

मैं grep को stdout और stderr (प्रभावी रूप से, दोनों को एक स्ट्रीम में जोड़ दिया है) सामग्री पर मिलान करना चाहूंगा।

नोट : यह प्रश्न पाइपिंग के बारे में पूछ रहा है, पुनर्निर्देशन नहीं - इसलिए यह उस प्रश्न का एक डुप्लिकेट नहीं है जिसे वर्तमान में डुप्लिकेट के रूप में चिह्नित किया गया है।


दूसरे प्रश्न ( stackoverflow.com/a/637834/1129642 ) को स्टडआउट और स्टडर दोनों को सही करने के लिए लिंक किए गए प्रश्न पर देखें । किसी अन्य प्रश्न की आवश्यकता नहीं है।
मार्की ५५५

4
@triplee एक सटीक डुप्लिकेट नहीं है, क्या यह है? पाइप बनाम फ़ाइल पर रीडायरेक्ट?
बेंजामिन डब्ल्यू।

@BenjaminW कम से कम एक उत्तर है जो दोनों परिदृश्यों को हल करता है, हालांकि यह स्वीकृत उत्तर नहीं है। यह एक काफी सामान्य प्रश्न है, इसलिए हम शायद एक बेहतर डुप्लिकेट पा सकते हैं, या एक मध्यस्थ को इनका विलय करने के लिए कह सकते हैं - या यहां तक ​​कि सबसे खराब स्थिति में, इस विषय के लिए एक पूरी तरह से नया विहित शिल्प तैयार करते हैं। यदि आप एक बेहतर डुप्लिकेट पाते हैं, तो हर तरह से इसे प्रस्तावित करें। अग्रिम में धन्यवाद।
ट्रिपल

12
@tripleee सॉल्व्स, हाँ, लेकिन कोई भी उत्तर |&शॉर्टकट का उपयोग नहीं करता है , जो मुझे लगता है कि "पाइप के लिए स्टडआउट और स्टेडर्र दोनों को पुनर्निर्देशित करना" का सबसे सुविधाजनक समाधान है।
बेंजामिन डब्ल्यू।

3
यह लिंक किए गए प्रश्न का डुप्लिकेट नहीं है, और यह स्पष्ट नहीं था कि मार्को का जवाब वही था जो मैं चाहता था। इसके अलावा, यह उल्लेख नहीं करता है | फिर से मतदान करना।
मार्टिन बोनर मोनिका का

जवाबों:


163

(ध्यान दें कि पुनर्निर्देशित करते समय एक फ़ाइल में &>>file जोड़ा&> जाएगा और पहले से मौजूद फ़ाइल को अधिलेखित कर देगा ।)

गठबंधन करने के लिए stdoutऔर stderrआप बाद वाले को पूर्व के उपयोग से पुनर्निर्देशित करेंगे 2>&1। यह stderout में stderr (फाइल डिस्क्रिप्टर 2) को रीडायरेक्ट करता है (फाइल डिस्क्रिप्टर 1), उदाहरण के लिए:

$ { echo "stdout"; echo "stderr" 1>&2; } | grep -v std
stderr
$

stdoutstdout को stderrजाता है, stderr को जाता है। grepकेवल देखता है stdout, इसलिए stderrटर्मिनल पर प्रिंट करता है।

दूसरी ओर:

$ { echo "stdout"; echo "stderr" 1>&2; } 2>&1 | grep -v std
$

दोनों stdout और stderr को लिखने के बाद, stdout में stderr को 2>&1पुनर्निर्देशित करता है और grepstdin पर दोनों तार देखता है, इस प्रकार दोनों को फ़िल्टर करता है।

आप यहां पुनर्निर्देशन के बारे में अधिक पढ़ सकते हैं ।

अपने उदाहरण (POSIX) के बारे में:

cmd-doesnt-respect-difference-between-stdout-and-stderr 2>&1 | grep -i SomeError

या, का उपयोग कर >=bash-4:

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

पर स्पष्टीकरण के लिए धन्यवाद &>>। मैंने अपना प्रश्न ठीक कर लिया है।
एंड्रयू फेरियर

18
मैंने अपने उदाहरण को मेरे उत्तर में जोड़ दिया, बस मामले में यह मेरे दिए गए उदाहरणों के आधार पर स्पष्ट नहीं था। साइड-नोट के रूप में, आप |&इसके स्थान पर बैश-विशिष्ट का भी उपयोग कर सकते हैं 2>&1 |
एड्रियन फ्रुविर्थ

13
|&भविष्य के पाठकों के लिए @ AdrianFrühwirth द्वारा प्रस्तावित शॉर्टकट के बारे में ध्यान दें : यह सुविधा केवल bash4+ संस्करण के साथ समर्थित है । यदि आप 3 या उससे नीचे का उपयोग कर रहे हैं, तो आपको साथ रहना होगा 2>&1 |
टॉमोकैफ

3
बैश पुनर्निर्देशन यहाँ बहुत अच्छी तरह से समझाया गया है । @ AdrianFrühwirth ने अच्छा काम किया है, जो लिंक चिपकाया गया वह और भी आगे बढ़ जाता है। कभी-कभी, मैं चाहता हूं कि आधिकारिक बैश प्रलेखन अच्छा था।
डेविड आंद्रेलेटी

112

बैश के लिए एक शॉर्टहैंड होता है 2>&1 |, जिसका नाम है |&, जो स्टडआउट और स्टेडर दोनों को पाइप करता है ( मैनुअल देखें ):

cmd-doesnt-respect-difference-between-stdout-and-stderr |& grep -i SomeError

यह बैश 4.0 में पेश किया गया था, रिलीज नोट्स देखें ।


पूर्णता के लिए इसे जोड़ने के लिए धन्यवाद। मैं अन्य उत्तर को सही रखने जा रहा हूं क्योंकि कई लोग अभी भी bash pre-4.0 का उपयोग कर रहे हैं। लेकिन यह उपयोगी है।
एंड्रयू फेरियर

9
सबसे विशेष रूप से शायद, मैश पर जहाजों कि यह समर्थन करने के लिए बहुत पुराना है।
फ़्लिम

@ फ़ीलम लेकिन zsh नहीं है
ट्रेंटन

1
चूँकि ksh उपयोग करता है | & coproc के लिए, यह अनावश्यक शॉर्टहैंड के लिए एक बुरा विकल्प की तरह लगता है। मैं अगले आदमी जितना ही डंप और पुनर्निर्देशन के ढेर के साथ लाइनों को देखने से नफरत करता हूं, लेकिन स्पष्ट होने के लिए कुछ कहना है .... और मैं माफी चाहता हूं कि यह टिप्पणी बहुत कुछ नहीं जोड़ती है। मैं वास्तव में मददगार जवाब को दरकिनार किए बिना शॉर्टहैंड के लिए अरुचि व्यक्त करना चाहता था, क्योंकि यह अच्छा है कि लोग इसे देखें। मुझे यह पता नहीं था, इसलिए मुझे जागरूक करने के लिए धन्यवाद।
पॉल

@PaHHodges मैं मानता हूं कि यह पोर्टेबल नहीं है - मैं मुख्य रूप से इंटरएक्टिव बैश सत्रों के लिए इसका उपयोग करना पसंद करता हूं ताकि बहुत अधिक टाइपिंग से बचा जा सके।
बेंजामिन डब्ल्यू।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.