2> और -, 2> / देव / अशक्त; - &, और> / देव / अशक्त और> / देव / अशक्त 2> & 1 के बीच अंतर


191

बस दोनों के बीच अंतर की तलाश है

  • 2>&-
  • 2>/dev/null
  • |&
  • &>/dev/null
  • >/dev/null 2>&1

और के साथ अपने पोर्टेबिलिटी non-Bourne shellsकी तरह tcsh, mkshआदि


2
ध्यान दें कि, जबकि &>GNU बैश कम्पैटिबिलिटी के लिए mksh सपोर्ट करता है , इसे जोरदार तरीके से इस्तेमाल न करने के लिए प्रोत्साहित किया जाता है, क्योंकि इसे पार्स करने से मौजूदा POSIX स्क्रिप्ट के शब्दार्थ टूट सकते हैं, और mksh इसे POSIX मोड में पहले ही निष्क्रिय कर देता है।
mirabilos

मैंने यह भी देखा है ^ /dev/nullकि वह क्या करता है?
बेलपटन

जवाबों:


241

पृष्ठभूमि के लिए:

  • एक नंबर 1 = बाहर मानक (यानी STDOUT)
  • एक नंबर 2 = मानक त्रुटि (यानी STDERR)
  • यदि कोई संख्या स्पष्ट रूप से नहीं दी गई है, तो संख्या 1 शेल (बैश) द्वारा ग्रहण की जाती है

पहले इन के फंक्शन को निपटाते हैं। संदर्भ के लिए उन्नत बैश-स्क्रिप्टिंग गाइड देखें

कार्य

2>&-

इस एक का सामान्य रूप है M>&-, जहां "एम" एक फाइल डिस्क्रिप्टर नंबर है। यह फाइल डिस्क्रिप्टर के लिए आउटपुट को बंद कर देगा, जिसका संदर्भ "एम" है

2>/dev/null

इस एक का सामान्य रूप है M>/dev/null, जहां "एम" एक फाइल डिस्क्रिप्टर नंबर है। यह फ़ाइल डिस्क्रिप्टर, "M" , को रीडायरेक्ट करेगा /dev/null

2>&1

इस एक का सामान्य रूप है M>&N, जहां "एम" और "एन" फ़ाइल डिस्क्रिप्टर नंबर हैं। यह फाइल डिस्क्रिप्टर "M" और "N" के आउटपुट को एक ही स्ट्रीम में जोड़ती है ।

|&

यह केवल एक संक्षिप्त नाम है 2>&1 |। इसे बैश 4 में जोड़ा गया था।

&>/dev/null

यह केवल एक संक्षिप्त नाम है >/dev/null 2>&1। यह फाइल डिस्क्रिप्टर 2 (STDERR) और डिस्क्रिप्टर 1 (STDOUT) को रीडायरेक्ट करता है /dev/null

>/dev/null

यह केवल एक संक्षिप्त नाम है 1>/dev/null। यह फ़ाइल डिस्क्रिप्टर 1 (STDOUT) को रीडायरेक्ट करता है /dev/null

गैर-बैश, टीसीएस, एमएक्सएच, आदि के लिए पोर्टेबिलिटी।

मैं के बाहर अन्य गोले के साथ ज्यादा नहीं निपटा गया है cshऔर tcsh। बैश के पुनर्निर्देशन ऑपरेटरों की तुलना में उन 2 के साथ मेरा अनुभव यह है कि इस संबंध में बैश बेहतर है। देखें tcsh आदमी पेज अधिक जानकारी के लिए।

आपके द्वारा किसी के बारे में पूछे गए आदेशों को सीधे csh / tcsh द्वारा समर्थित नहीं किया जाता है। समान कार्यों के निर्माण के लिए आपको अलग-अलग सिंटैक्स का उपयोग करना होगा।


हमें विजेता मिल गया। लेकिन इसलिए कोई प्रदर्शन अंतर या 2>&-बनाम के साथ ऐसा कुछ नहीं है 2>/dev/null(इसके अलावा कुछ "खराब" लिखित प्रोग्राम 2>&-सही ढंग से अप्रतिबंधित नहीं हैं)?
Det

3
कोई प्रदर्शन अंतर नहीं होना चाहिए।
स्लम

5
&>bashशुरुआत से था (और बॉर्न और पोसिक्स संगतता को तोड़ता है क्योंकि इसका मतलब वहां कुछ अलग है, हालांकि हिट होने की संभावना नहीं है)। >&और |&से आते हैं (t)csh(और यह stderr रीडायरेक्ट करने के लिए उनके लिए एक ही रास्ता है)। वे zshशुरू से थे और हाल ही में ही जोड़े गए हैं bashrcबेहतर डिज़ाइन किए गए ऑपरेटरों के लिए भी देखें ।
स्टीफन चेज़लस

1
अपडेट: प्रदर्शन मुद्दे के बारे में है, वह भी यहाँ की पुष्टि की है: unix.stackexchange.com/questions/163955/...
Det

1
हाय @ एसएलएम, संपर्क के लिए धन्यवाद। मुझे खुशी है कि मेरा रेपो नहीं बदला (+2-2=0)। अब, संस्करण भाग में, मैं बहुत कुछ संपादित नहीं करता हूं, लेकिन इस मामले में मैं करूंगा, क्योंकि यह स्पष्ट करता है कि ऑपरेशन के बाद का डेटा होगा N। मैंने पढ़ा है कि आप इसके माध्यम से उत्तर देते हैं, और यह सभी पहलुओं में बहुत ठीक है। बस इस छोटी सी अस्पष्टता ने मुझे सोच लिया, यही कारण है कि संस्करण। लेकिन ठीक है, फिर से जोड़ने या अस्वीकार करने के लिए स्वतंत्र महसूस करें, जैसा कि आप करेंगे। मुझे उम्मीद है कि मैं बात समझा सकता हूं। अच्छा काम करते रहें।
डॉ। बीको

11

यह STDERR और STDOUT को पुनर्निर्देशित करने के लिए है:

  • 2>/dev/null

    STDERR को / dev / null पर पुनर्निर्देशित करें (कंसोल पर दिखाने से रोकें)

  • |&

    अनुप्रेषित STDERR और STDIN से पाइप्ड कमांड (cmd1 | & cmd2)

  • &>/dev/null

    STDERR और STDOUT दोनों को / dev / null पर पुनर्निर्देशित करें (कंसोल पर कुछ भी नहीं दिखा)

  • >/dev/null

    अनुप्रेषित STDOUT / dev / null (कंसोल पर केवल STDERR शो)

  • 2>&-

    पुनर्निर्देशन के साथ उपयोग किए जाने वाले फ़ाइल डिस्क्रिप्टर को बंद करने के लिए है

बॉर्न गोले के लिए ये सभी मानक पुनर्निर्देशन विधियां हैं।


4
|&और पोर्टेबल नहीं&>/dev/null हैं ।
क्रिस डाउन

4

चयनित उत्तर के लिए इस पर विचार करें। आप जानना चाह सकते हैं कि कौन से फॉर्म POSIX हैं और कौन से नहीं हैं।

दो POSIX फॉर्म शामिल हैं:

2.7.2 पुनर्निर्देशन आउटपुट

रीडायरेक्ट आउटपुट के लिए दो सामान्य प्रारूप हैं:

[N]> शब्द

[N]> | शब्द

जहाँ वैकल्पिक n फ़ाइल डिस्क्रिप्टर संख्या का प्रतिनिधित्व करता है। यदि संख्या छोड़ दी जाती है, तो पुनर्निर्देशन मानक आउटपुट (फ़ाइल विवरण 1) का संदर्भ देगा।

'>' प्रारूप का उपयोग करके आउटपुट पुनर्निर्देशन विफल हो जाएगा यदि नोकलोबर विकल्प सेट किया गया है (सेट -C का विवरण देखें) और शब्द के विस्तार द्वारा नामित फ़ाइल मौजूद है और एक नियमित फ़ाइल है। अन्यथा, '>' या "> |" प्रारूप फ़ाइल का नाम देगा जिसका नाम शब्द के विस्तार से उत्पन्न होता है और निर्दिष्ट फ़ाइल विवरणक, या मानक आउटपुट पर आउटपुट के लिए खोला जाता है यदि कोई भी निर्दिष्ट नहीं है। यदि फ़ाइल मौजूद नहीं है, तो इसे बनाया जाएगा; अन्यथा, इसे खोले जाने के बाद एक खाली फ़ाइल होने के लिए छोटा कर दिया जाएगा।

-

2.7.6 डुप्लिकेटिंग आउटपुट फ़ाइल डिस्क्रिप्टर

पुनर्निर्देशन ऑपरेटर:

[N]> और शब्द

एक आउटपुट फ़ाइल डिस्क्रिप्टर को दूसरे से डुप्लिकेट करेगा, या एक को बंद करेगा। यदि शब्द एक या अधिक अंकों का मूल्यांकन करता है, तो n, या मानक आउटपुट द्वारा निर्दिष्ट फाइल डिस्क्रिप्टर यदि n निर्दिष्ट नहीं है, तो शब्द द्वारा निरूपित फाइल डिस्क्रिप्टर की एक प्रति बनाई जाएगी; यदि शब्द में अंक आउटपुट के लिए पहले से खुले एक फाइल डिस्क्रिप्टर का प्रतिनिधित्व नहीं करते हैं, तो एक पुनर्निर्देशन त्रुटि का परिणाम होगा; शेल त्रुटियों के परिणाम देखें। यदि शब्द '-' का मूल्यांकन करता है, तो फ़ाइल डिस्क्रिप्टर n या मानक आउटपुट यदि n निर्दिष्ट नहीं है, तो बंद है। फ़ाइल डिस्क्रिप्टर को खोलने का प्रयास जो खुला नहीं है, उसमें त्रुटि नहीं होगी। यदि शब्द किसी और चीज़ का मूल्यांकन करता है, तो व्यवहार अनिर्दिष्ट है।

इसलिए:

Function      POSIX-compat    POSIX 
2>&-          Yes             close 
2>/dev/null   Yes             redir
2>&1          Yes             dup 
|&            No              
&>/dev/null   No
>/dev/null    Yes             redir
>&/dev/null   ?               ?dup

अंतिम पंक्ति मूल प्रश्न में नहीं है, लेकिन यह बिना किसी शिकायत के काम करती है। (साथ ही / dev / null के लिए प्रतिस्थापित / dev / tty के साथ काम करता है)।


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