TL; DR: (बैश और zsh)
$ cmd 2> >(stderr-filter >&2)
उदाहरण:
% cat /non-existant 2> >(tr o X >&2)
cat: /nXn-existant: NX such file Xr directXry
%
StackExchange नेटवर्क पर कई उत्तरों के रूप हैं:
cat /non-existant 3>&1 1>&2 2>&3 3>&- | sed 's/e/E/g'
इसमें एक अंतर्निहित धारणा है: फ़ाइल डिस्क्रिप्टर 3 का उपयोग किसी और चीज़ के लिए नहीं किया जा रहा है।
इसके बजाय, नामित फ़ाइल डिस्क्रिप्टर का उपयोग करें, और {ba,z}sh
अगली उपलब्ध फ़ाइल डिस्क्रिप्टर> = 10 को आवंटित करेगा:
cat /non-existant {tmp}>&1 1>&2 2>&$tmp {tmp}>&- | sed 's/e/E/g'
ध्यान दें कि फ़ाइल डिस्क्रिप्टर का नाम POSIX द्वारा समर्थित नहीं है sh
।
उपरोक्त के साथ अन्य मुद्दा यह है कि कमांड को फिर से एसटीडीयूएसटी और एसटीडीआरआर को फिर से स्वैप किए बिना कमांड को आगे नहीं बढ़ाया जा सकता है।
पोसिक्स में आगे की पाइपिंग की अनुमति देने के लिए sh
, (और अभी भी एफडी 3 यह उपयोग नहीं है) यह जटिल हो जाता है :
(cmd 2>&1 >&3 3>&- | stderr-filter >&2 3>&-) 3>&1
इस प्रकार, इस धारणा और स्पष्ट रूप से वाक्यविन्यास को देखते हुए, आप ऊपर दिए गए TL; DR में सरल bash
/ zsh
वाक्यविन्यास का उपयोग करके बेहतर होने की संभावना रखते हैं , और यहां समझाया गया है ।