मैं zsh में केवल stderr पाइप कैसे कर सकता हूं?


18

बैश में:

$ echo hi 2>&1 1>/dev/null | cat
$

जबकि zsh में:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

क्या मानक को पुनर्निर्देशित करते समय केवल मानक त्रुटि को पाइप करने का एक तरीका है?

जवाबों:


22

Zsh और mult_iosविकल्प के साथ (डिफ़ॉल्ट रूप से), में:

echo hi 2>&1 1>/dev/null | cat

1> /dev/null | catकी एक बहु पुनर्निर्देशन रूप में देखा जाता echoहै stdout।

इसलिए echoस्टडआउट को अब /dev/nullऔर दोनों को एक पाइप पर पुनर्निर्देशित किया जाता है cat(जैसे कि उपयोग कर रहा है tee)।

उस कई पुनर्निर्देशन को रद्द करने के लिए, आप यह कर सकते हैं:

echo hi 2>&1 >&- > /dev/null | cat

यही है, समापन (पाइपिंग को रद्द करना) को रीडायरेक्ट करने से पहले बंद करना /dev/null

या एक कमांड समूह का उपयोग करें या इस तरह सदस्यता लें:

{echo hi 2>&1 1>/dev/null} | cat 
(echo hi 2>&1 1>/dev/null) | cat

इस तरह, echoस्टडआउट को केवल एक बार स्पष्ट रूप से पुनर्निर्देशित किया जाता है (पाइप पुनर्निर्देशन समूह / उपधारा पर लागू होता है और इसके द्वारा विरासत में मिला है echo)।

या आप multiosपूरी तरह से अक्षम कर सकते हैं :

(setopt nomultios; echo hi 2>&1 > /dev/null | cat)

वैकल्पिक रूप से, आप पाइप के बजाय प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं :

echo hi 2> >(cat) > /dev/null

हालांकि खबरदार है कि जब नौकरी पर नियंत्रण बंद है (लिपियों की तरह), catप्रक्रिया अतुल्यकालिक रूप से चल रही होगी (जैसे कि अगर शुरू किया गया &)।


3
धन्यवाद! इसके चारों ओर पाने का एक और तरीका है (echo hi 2>&1 1>/dev/null) | cat
तवियन बार्न्स

1
@TavianBarnes, अच्छी बात, धन्यवाद। मैंने इसे पूर्णता के उत्तर में जोड़ दिया है। यह एक कमांड ग्रुप ( {echo...}|cat)
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.