कभी-कभी आप stdout और stderr दोनों को एक ही स्थान पर पुनर्निर्देशित करना चाहते हैं , यह तब >&
होता है जब इसका उपयोग किया जाता है - यह एक फ़ाइल विवरणक को दूसरे को इंगित करता है।
उदाहरण के लिए, यदि आप stdout और stderr दोनों को एक ही फ़ाइल में लिखना चाहते हैं (यह हो /dev/null
या नहीं output.txt
), तो आप अलग-अलग रीडायरेक्ट कर सकते हैं, साथ में
app 1>/dev/null 2>/dev/null
या आप एक फ़ाइल डिस्क्रिप्टर को फ़ाइल में रीडायरेक्ट कर सकते हैं, और दूसरी फ़ाइल डिस्क्रिप्टर को पहले एक में:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
पहले उदाहरण में, 2>&1
पॉइंट फाइल डिस्क्रिप्टर # 2 से जहाँ # 1 पहले से ही इंगित कर रहा है। दूसरा उदाहरण वही प्राप्त करता है, जो स्टादर के बजाय शुरू होता है।
एक अन्य उदाहरण के रूप में, ऐसे मामले हैं जब stdout (फाइल डिस्क्रिप्टर # 1) पहले से ही वांछित स्थान की ओर इशारा कर रहा है, लेकिन आप इसे नाम से संदर्भित नहीं कर सकते हैं (यह पाइप, सॉकेट या इस तरह से जुड़ा हो सकता है)। यह अक्सर प्रक्रिया विस्तार ( ` `
या $( )
ऑपरेटर्स) का उपयोग करते समय होता है , जो सामान्य रूप से केवल स्टडआउट को पकड़ता है, लेकिन आप इसमें स्टाडर को शामिल करना चाह सकते हैं। इस स्थिति में, आप >&
stderr को stdout को इंगित करने के लिए भी उपयोग करेंगे :
out=$(app 2>&1)
एक अन्य आम उदाहरण एक पेजर, या grep
, या इसी तरह की उपयोगिता है, क्योंकि पाइप |
सामान्य रूप से केवल स्टडआउट पर काम करता है, आप पाइप का उपयोग करने से पहले स्टडआउट पर पुनर्निर्देशित करेंगे:
app 2>&1 | grep hello
कैसे पता करने के लिए, जिनमें से 2>&1
या 1>&2
सही है? पहले से ही सेट फ़ाइल वर्णनकर्ता के अधिकार के लिए चला जाता है >&
, और फ़ाइल वर्णनकर्ता आप रीडायरेक्ट करना चाहते बाईं ओर चला जाता है। ( 2>&1
"पॉइंट फाइल डिस्क्रिप्टर # 2 को डिस्क्रिप्टर # 1 फाइल करने के लिए")।
कुछ गोले में आम पुनर्निर्देशन के लिए शॉर्टकट हैं; यहाँ बैश से उदाहरण हैं:
1>
को छोटा किया जा सकता है >
1>foo 2>&1
को >&foo
या&>foo
2>&1 | program
सेवा मेरे |& program
app 1>/dev/null 2>&1
का मतलब होगा कि 2> और 1 उस फ़ाइल को इंगित करेगा जो 1 पहले से ही रीडायरेक्ट कर रही थी। मैं इसे आसानी से कर सकता हूँapp > /dev/null &>
?