आउटपुट पुनर्निर्देशन में वास्तव में क्या होता है?


19

मैं सामान को पसंद करता हूं command 1> outया फिर 2>&1स्ट्रीडर को पुनर्निर्देशित करता हूं, लेकिन कभी-कभी मैं &>खुद भी देखता हूं , आदि।

समझने का सबसे अच्छा तरीका क्या है &और इसका सही अर्थ क्या है?

जवाबों:


26

&में 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। इसे एक उदाहरण से समझाता हूं।

सेट अप:

  1. kokoनिम्नलिखित सामग्री के साथ एक फ़ाइल बनाएँ :

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. इसे निष्पादित करें: chmod u+x koko

  3. अब ध्यान दें कि j1मौजूद नहीं है

  4. अब दौड़ो ./koko &> output

  5. दौड़ो 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करेगा, इसलिए यह टर्मिनल में दिखाई देगा और आप इसे पाइप कर सकते हैं या रीडायरेक्ट कर सकते हैं फिर से, लेकिन यह फ़ाइल में नहीं लिखा जाएगा।


2
&>मतलब क्या है ?
AJJ

1
ध्यान दें कि command >file 2>&1पुनर्निर्देशन के क्रम में महत्वपूर्ण है। यदि आप command 2>&1 >fileइसके बजाय लिखते हैं (जो आम तौर पर वह नहीं है जो आप चाहते हैं), यह पहले कमांड के स्टडआउट को फ़ाइल में रीडायरेक्ट करेगा और उसके बाद कमांड के स्टडर को अब अप्रयुक्त स्टडआउट पर रीडायरेक्ट करेगा, इसलिए यह टर्मिनल में दिखाई देगा और आप इसे पाइप कर सकते हैं या इसे फिर से रीडायरेक्ट करें, लेकिन यह फ़ाइल में नहीं लिखा जाएगा।
बाइट कमांडर

2
"वह भेजा जाएगा standard outputजिसे आप अपने टर्मिनल में देखेंगे।" यह "को" नहीं होना चाहिए standard error?
frarugi87

1
हाँ @ frarugi87 आपका अधिकार सही है
जॉर्ज उदेन

1
@ जॉर्ज वाह, आप तेज थे;) अच्छा काम
frarugi87

5

2
IIRC &> FILEकेवल बैश के लिए विशिष्ट है जबकि >FILE 2>&1गोले की अधिक संख्या से समझा जाता है।
बाइट कमांडर

@ बाइटकोम्मैंडर, ओह, मुझे यह भी नहीं पता था कि बैश में ऐसा शॉर्टहैंड था ... मैंने हमेशा 2> और 1 का उपयोग किया है।
psusi

1

[n]>&wordकहा जाता है नकल आउटपुट फ़ाइल डिस्क्रिप्टर (देखें खंड 2.7.6 POSIX शैल भाषा स्टैंडर्ड की)। यह विशेष रूप से व्यवहार सहित गोले, सीमा की तरह की सुविधा है ksh, dashऔर bash; वास्तव में, मानक बॉर्न शेल के आसपास आधारित है और kshTcsh और 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 कोड नहीं है?

यह सभी देखें:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.