बैश में:
$ echo hi 2>&1 1>/dev/null | cat
$
जबकि zsh में:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
क्या मानक को पुनर्निर्देशित करते समय केवल मानक त्रुटि को पाइप करने का एक तरीका है?
बैश में:
$ echo hi 2>&1 1>/dev/null | cat
$
जबकि zsh में:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
क्या मानक को पुनर्निर्देशित करते समय केवल मानक त्रुटि को पाइप करने का एक तरीका है?
जवाबों:
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
प्रक्रिया अतुल्यकालिक रूप से चल रही होगी (जैसे कि अगर शुरू किया गया &
)।
{echo...}|cat
)
(echo hi 2>&1 1>/dev/null) | cat
।