जवाबों:
&में 2>&1बस का कहना है कि नंबर 1एक फ़ाइल वर्णनकर्ता और नहीं एक फ़ाइल नाम है। इस मामले में standard output file descriptor।
यदि आप उपयोग करते हैं 2>1, तो यह एक फ़ाइल नामक त्रुटियों को रीडायरेक्ट करेगा, 1लेकिन यदि आप उपयोग करते हैं 2>&1, तो यह इसे भेज देगा standard output stream।
यह &>कहता है कि दोनों को भेजें, standard outputऔर standard error, कहीं। उदाहरण के लिए, ls <non-existent_file> &> out.file। इसे एक उदाहरण से समझाता हूं।
सेट अप:
kokoनिम्नलिखित सामग्री के साथ एक फ़ाइल बनाएँ :
#!bin/bash
ls j1
echo "koko2"
इसे निष्पादित करें: chmod u+x koko
अब ध्यान दें कि j1मौजूद नहीं है
अब दौड़ो ./koko &> output
दौड़ो cat outputऔर तुम देखोगे
ls: cannot access 'j1': No such file or directory
koko2
दोनों standard error( ls: cannot access 'j1': No such file or directory) और standard output( koko2) फ़ाइल में भेजे गए थे output।
अब इसे फिर से चलाएं लेकिन इस बार जैसे:
./koko > output
करो cat outputऔर तुम केवल koko2जैसा देखोगे । लेकिन ls j1कमांड से एरर आउटपुट नहीं । यही कारण है कि को भेजा जाएगा standard errorजो आप अपने टर्मिनल में देखेंगे।
@ नोट कमांडर के लिए महत्वपूर्ण नोट:
ध्यान दें कि command >file 2>&1पुनर्निर्देशन के क्रम में यह महत्वपूर्ण है। यदि आप command 2>&1 >fileइसके बजाय लिखते हैं (जो आम तौर पर वह नहीं है जो आप चाहते हैं), यह पहले कमांड stdoutको फाइल में रीडायरेक्ट करेगा और उसके बाद कमांड का stderrअब अप्रयुक्त तक रीडायरेक्ट stdoutकरेगा, इसलिए यह टर्मिनल में दिखाई देगा और आप इसे पाइप कर सकते हैं या रीडायरेक्ट कर सकते हैं फिर से, लेकिन यह फ़ाइल में नहीं लिखा जाएगा।
command >file 2>&1पुनर्निर्देशन के क्रम में महत्वपूर्ण है। यदि आप command 2>&1 >fileइसके बजाय लिखते हैं (जो आम तौर पर वह नहीं है जो आप चाहते हैं), यह पहले कमांड के स्टडआउट को फ़ाइल में रीडायरेक्ट करेगा और उसके बाद कमांड के स्टडर को अब अप्रयुक्त स्टडआउट पर रीडायरेक्ट करेगा, इसलिए यह टर्मिनल में दिखाई देगा और आप इसे पाइप कर सकते हैं या इसे फिर से रीडायरेक्ट करें, लेकिन यह फ़ाइल में नहीं लिखा जाएगा।
standard outputजिसे आप अपने टर्मिनल में देखेंगे।" यह "को" नहीं होना चाहिए standard error?
> FILE 2>&1और &> FILEबराबर हैं। 8.2.3.2 देखें । शुरुआती अध्याय 8 के लिए बैश गाइड में त्रुटियों का पुनर्निर्देशन
&> FILEकेवल बैश के लिए विशिष्ट है जबकि >FILE 2>&1गोले की अधिक संख्या से समझा जाता है।
[n]>&wordकहा जाता है नकल आउटपुट फ़ाइल डिस्क्रिप्टर (देखें खंड 2.7.6 POSIX शैल भाषा स्टैंडर्ड की)। यह विशेष रूप से व्यवहार सहित गोले, सीमा की तरह की सुविधा है ksh, dashऔर bash; वास्तव में, मानक बॉर्न शेल के आसपास आधारित है और ksh। Tcsh और csh मैनुअल को देखते हुए , वे स्पष्ट रूप से किसी भी फाइल डिस्क्रिप्टर को डुप्लिकेट करने की क्षमता प्रदान नहीं करते हैं, हालांकि, के विवरण से >&, यह व्यवहार करता &>है bash(जैसे, फाइल में त्रुटियों और सामान्य आउटपुट को रीडायरेक्ट करता है)।
उबंटू सहित सिस्टम जैसे निक्स में, आप अक्सर सुनते हैं कि सब कुछ फ़ाइल है, या फ़ाइल डिस्क्रिप्टर है । मानक आउटपुट निरंतर फ़ाइल डिस्क्रिप्टर 1 है और मानक त्रुटि फ़ाइल डिस्क्रिप्टर 2 है। इसलिए, > FILE 2>&1तकनीकी रूप से फ़ाइल डिस्क्रिप्टर पर डुप्लिकेट फ़ाइल डिस्क्रिप्टर 2 का अर्थ है। इस उत्तर के अन्य शब्दों में :
2> और 1 शेल को कमांड को एक फाइल डिस्क्रिप्टर 2 देने के लिए कहता है जो कि डिस्क्रिप्टर 1 का डुप्लिकेट है। (यानी उसी fd पर stderr और stdout पॉइंट)।
यहाँ पर यह ध्यान रखना है कि डिस्क्रिप्टर 1 को पहले सेट करना है। क्योंकि शेल बाएं से दाएं क्रम में पुनर्निर्देशन करता है, इसलिए शेल पहले की तरह जाने के command >FILE 2>&1लिए स्टडआउट को फिर से बताता है , और उसके बाद ही डिस्क्रिप्टर 2 1 की कॉपी बन सकता है, जो कि 1 और 2 उसी स्थान पर इंगित करता है - ।commandFILEFILE
यह पाठ्यक्रम मानक त्रुटि और मानक आउटपुट से परे है। जैसा कि इस जवाब में दिखा रहा है, करके3&>2
... आप डुप्लिकेट 3 पर डुप्लीकेट (डुप 2) फ़ेडरशीटर 2, संभवतया फ़ाइलेस्क्रिप्ट 3 को बंद कर रहे हैं यदि यह पहले से ही खुला है
फ़ाइल डिस्क्रिप्टर के हेरफेर का उदाहरण, कई के बीच, चर में कमांड के आउटपुट को कैप्चर करना होगाdialog
यह भी ध्यान देने योग्य है जो इसके &>लिए विशिष्ट है bash। इसमें zshवही व्यवहार किया जाता है, लेकिन प्रलेखन के अनुसार, "... बहुओं की उपस्थिति में '> शब्द 2> और 1' के समान प्रभाव नहीं रखता है"। POSIX शिकायत में /bin/sh, इसे पृष्ठभूमि में कमांड डालने के साथ नियमित पुनर्निर्देशन के रूप में माना जाएगा। यह भी देखें, क्या कोई ऐसा sh कोड है जो वाक्य-रचना के मान्य bash कोड नहीं है? ।
यह सभी देखें:
&>मतलब क्या है ?