बैश में:
$ 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।