जवाबों:
&
में 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 उसी स्थान पर इंगित करता है - ।command
FILE
FILE
यह पाठ्यक्रम मानक त्रुटि और मानक आउटपुट से परे है। जैसा कि इस जवाब में दिखा रहा है, करके3&>2
... आप डुप्लिकेट 3 पर डुप्लीकेट (डुप 2) फ़ेडरशीटर 2, संभवतया फ़ाइलेस्क्रिप्ट 3 को बंद कर रहे हैं यदि यह पहले से ही खुला है
फ़ाइल डिस्क्रिप्टर के हेरफेर का उदाहरण, कई के बीच, चर में कमांड के आउटपुट को कैप्चर करना होगाdialog
यह भी ध्यान देने योग्य है जो इसके &>
लिए विशिष्ट है bash
। इसमें zsh
वही व्यवहार किया जाता है, लेकिन प्रलेखन के अनुसार, "... बहुओं की उपस्थिति में '> शब्द 2> और 1' के समान प्रभाव नहीं रखता है"। POSIX शिकायत में /bin/sh
, इसे पृष्ठभूमि में कमांड डालने के साथ नियमित पुनर्निर्देशन के रूप में माना जाएगा। यह भी देखें, क्या कोई ऐसा sh कोड है जो वाक्य-रचना के मान्य bash कोड नहीं है? ।
यह सभी देखें:
&>
मतलब क्या है ?