2010-02-26 7 views
32

त्वरित एक, 2>&1 stderr को stdout पर रीडायरेक्ट करता है, लेकिन एम्परसैंड का क्या अर्थ है? मुझे पता है कि हमारे पास 2 > 1 था, यह 1 नाम की एक फ़ाइल में आउटपुट होगा, एम्परसेंड क्या करता है?इस बैश कमांड में एम्पर्सेंड इंगित करता है 1> और 2

+0

की संभावित डुप्लिकेट (http://stackoverflow.com/questions/818255/in-the-shell-what -does-21-mean) –

उत्तर

16

यह प्रतियां फ़ाइल वर्णनकर्ता 1 दायर करने के लिए वर्णनकर्ता 2. FD2 stderr है और FD1, stdout है, इसलिए यह बनाता है stderr के लिए कोई आउटपुट इसके बजाय stdout पर जाना।

+1

धन्यवाद, इसलिए फ़ाइल – mikip

+1

फ़ाइल के बजाय desciptor फ़ाइल आउटपुट का मतलब है और यह फ़ाइल वर्णनकर्ताओं में हेरफेर करता है। –

55

2>&1 मानक फ़ाइल (फ़ाइल हैंडल 2) को उसी फ़ाइल में रीडायरेक्ट करता है जो मानक आउटपुट (फ़ाइल हैंडल 1) वर्तमान में पर जा रहा है।

यह भी तो एक स्थिति पर निर्भर बात है:

prog >x 2>&1 >y 

वास्तव में मानक त्रुटि x और मानक आउटपुट में y को इस प्रकार भेज देंगे:

  • कनेक्ट x को मानक आउटपुट;
  • फिर वर्तमान मानक आउटपुट के रूप में मानक त्रुटि को कनेक्ट करें, जो x है;
  • फिर मानक उत्पादन को y से कनेक्ट करें;
+2

अगर मैं कर सकता तो मैं कई बार इसे ऊपर उठाऊंगा। मैं इसे खत्म कर रहा हूं, और * ऑर्डर * के महत्व के बारे में आपकी व्याख्या वर्तमान बैश दस्तावेज से स्पष्ट है: http://www.gnu.org/software/bash/manual/bashref.html#Redirections। धन्यवाद! – FMc

+1

यह चीजों को बताता है! लिनक्स का उपयोग करने के अपने 8 वर्षों में, किसी ने भी इस बात को स्पष्ट रूप से समझाया नहीं! धन्यवाद दोस्त। –

6

info bash से:

3.6.7 Duplicating File Descriptors 
---------------------------------- 

The redirection operator 
    [N]<&WORD 
    is used to duplicate input file descriptors. If WORD expands to one 
or more digits, the file descriptor denoted by N is made to be a copy 
of that file descriptor. If the digits in WORD do not specify a file 
descriptor open for input, a redirection error occurs. If WORD 
evaluates to `-', file descriptor N is closed. If N is not specified, 
the standard input (file descriptor 0) is used. 

    The operator 
    [N]>&WORD 
    is used similarly to duplicate output file descriptors. If N is not 
specified, the standard output (file descriptor 1) is used. If the 
digits in WORD do not specify a file descriptor open for output, a 
redirection error occurs. As a special case, if N is omitted, and WORD 
does not expand to one or more digits, the standard output and standard 
error are redirected as described previously. 

तो 2>&1 डुप्लिकेट fd पर fd 1 2.

16

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

0

ampersand कुछ भी नहीं करता है - यह 2>&1 ऑपरेटर में अपने आप में एक चीज़ होने की बजाय चरित्र है।

बैश कई redirection operators का समर्थन करता है, 2>&1 ऑपरेटर या &> ऑपरेटर पुनर्निर्देशन से पहले या बाद में प्रक्रिया की धाराओं को एक साथ जोड़ता है।

12

&&1 फ़ाइल डिस्क्रिप्टर 1 डुप्लिकेट करता है। डुप्लिकेट डिस्क्रिप्टर वास्तव में एक प्रति की तरह व्यवहार नहीं करता है, लेकिन पुराने के उपनाम की तरह। डुप्लिकेटिंग 1 एकाधिक धाराओं को एक दूसरे को ओवरराइट किए बिना 1 पर रीडायरेक्ट करने की अनुमति देता है।

उदाहरण: (कोई &)

$ ls existing-file non-existent-file > tmp 2> tmp 
$ cat tmp 
existing-file 
nt-file: No such file or directory 

ध्यान दें कि 1 अधिलेखित कर दिया क्या 2 लिखा था।लेकिन जब हम & का उपयोग नहीं:

$ ls existing-file non-existent-file > tmp 2>&1 
$ cat tmp 
ls: non-existent-file: No such file or directory 
existing-file 

एक फ़ाइल वर्णनकर्ता (जैसे कि एक पाइप या नेटवर्क सॉकेट के रूप में या अन्य इनपुट/आउटपुट संसाधन,) एक फाइल करने के लिए एक संभाल है। जब 1 और 2 अलग-अलग tmp (पहले उदाहरण के रूप में) पर रीडायरेक्ट किए जाते हैं, तो वे स्वतंत्र रूप से tmp फ़ाइल सूचक को स्थानांतरित करते हैं। यही कारण है कि फाइल डिस्क्रिप्टर एक-दूसरे को ओवरराइट करते हैं।

Linux man page के अनुसार

:

[डुप्लिकेट फ़ाइल वर्णनकर्ता] एक ही फ़ाइल खोलने विवरण देखें और इस तरह साझा फ़ाइल ऑफसेट और फ़ाइल स्थिति झंडे; उदाहरण के लिए, यदि फ़ाइल ऑफसेट को डिस्क्रिप्टर में से एक पर lseek (2) का उपयोग करके संशोधित किया गया है, ऑफ़सेट भी दूसरे के लिए बदल दिया गया है।

नोट है कि भले ही & में कार्य करता है एक उपनाम की तरह, 2>&1 साधन धारा है कि 1में वर्तमान में की ओर इशारा करते के लिए 2 अनुप्रेषित। जब 1 किसी अन्य फ़ाइल पर रीडायरेक्ट किया जाता है, 2 उसी फ़ाइल पर इंगित करता है जो इसे 1 से स्वतंत्र रूप से किया गया था।

का निरीक्षण करें: [? खोल में, क्या करता है "2> & 1" मतलब]

$ ls existing-file non-existent-file > tmp 2>&1 > tmp1 
$ cat tmp1 
existing-file 
$ cat tmp 
ls: non-existent-file: No such file or directory 
संबंधित मुद्दे