> और क्या मतलब है?


81

मैं इस अभिव्यक्ति से थोड़ा उलझन में था:

gcc -c -g program.c >& compiler.txt

मुझे पता है कि &>filenameफाइल करने के लिए stdout और stderr दोनों को रीडायरेक्ट करेंगे filename। लेकिन इस मामले में एम्परसेंड साइन की तुलना में अधिक है। यह अपने रूप की तरह दिखता है M>&N, जहां Mऔर Nफ़ाइल विवरण हैं।

ऊपर स्निपेट में, करता है M=1और N='compiler.txt'? यह इससे कितना अलग है:

gcc -c -g program.c > compiler.txt     (ampersand removed)

मेरी समझ यह है कि प्रत्येक ओपन फाइल 2. से अधिक फाइल डिस्क्रिप्टर से जुड़ी है। क्या यह सही है?

यदि ऐसा है, तो एक फ़ाइल नाम विनिमेय है जिसका फ़ाइल विवरण पुनर्निर्देशन के लक्ष्य के रूप में है?

जवाबों:


93

यह भी ऐसा ही है &>। बैश मैनपेज से:

मानक आउटपुट और मानक त्रुटि को पुनर्निर्देशित करना यह निर्माण मानक आउटपुट (फ़ाइल डिस्क्रिप्टर 1) और मानक त्रुटि आउटपुट (फ़ाइल डिस्क्रिप्टर 2) दोनों को उस फ़ाइल पर रीडायरेक्ट करने की अनुमति देता है जिसका नाम शब्द का विस्तार है।

There are two formats for  redirecting  standard  output  and  standard
error:

       &>word
and
       >&word

Of the two forms, the first is preferred.  This is semantically equiva-
lent to

       >word 2>&1

7
मैं मूर्खता महसूस करता हूं। मैंने अन्य स्रोतों को पढ़ने में समय व्यतीत किया और यह मैनपेज में वहीं था।
गर्भनिरोधक

3
>&csh और tsh द्वारा सिंटैक्स का उपयोग स्टडआउट और स्टडर दोनों को पुनर्निर्देशित करने के लिए किया जाता है। शायद इसीलिए बैश इसे स्वीकार करता है।
कीथ थॉम्पसन

4
क्या इसका मतलब यह है कि &>wordऔर >word 2>&1शब्दार्थ समतुल्य हैं? "यह" के प्रति अनुराग मुझे स्पष्ट नहीं है।
जीनोरमा

8
@geneorama &>word, >word 2>&1, और >&word बिल्कुल वैसा ही कर रहे हैं।
जोर्डनम

1
अब मुझे एहसास हुआ कि मैंने जो कहीं और पढ़ा है, उसके आधार पर मुझसे पहले एक गलती हुई। >केवल मानक को पुनर्निर्देशित करता है। >त्रुटि को पुनर्निर्देशित नहीं करता है। (मुझे शायद अपनी भविष्य की टिप्पणियों को पुनर्निर्देशित करना चाहिए /dev/null)
जीनोरमा

8

&>बनाम >&: पसंदीदा संस्करण &>(क्लोबर) है

के बारे में:

  • &>
  • >&

दोनों फाइल को क्लॉबर करेंगे - इसे लिखने से पहले फाइल को 0 बाइट्स में काट दें, जैसे > fileकि केवल STDIN- केस में होता है।

हालाँकि , bashमैन्युअल पुनर्निर्देशन अनुभाग कहता है कि:

दो रूपों में से, पहले को प्राथमिकता दी जाती है। यह शब्दार्थ के बराबर है

>word 2>&1

दूसरे रूप का उपयोग करते समय, शब्द एक संख्या तक या विस्तार नहीं कर सकता है -। यदि ऐसा होता है, तो अन्य पुनर्निर्देशन ऑपरेटर संगतता कारणों के लिए (नीचे डुप्लिकेटिंग फ़ाइल डिस्क्रिप्टर्स देखें) लागू होते हैं।

(नोट: में zshदोनों बराबर हैं ।)

पहले ( &>) फॉर्म में फिंगर मेमोरी प्राप्त करना बहुत अच्छा अभ्यास है , क्योंकि:

का प्रयोग करें &>>रूप >>&से supprted नहीं है bash(संलग्न)

केवल एक परिशिष्ट प्रपत्र है:

मानक आउटपुट और मानक त्रुटि को लागू करने का प्रारूप है:

&>>word

यह शब्दार्थ के बराबर है

>>word 2>&1

(नीचे डुप्लिकेट फ़ाइल डिस्क्रिप्टर्स देखें)।

ध्यान दें:

  • ऊपर दिए गए अनुभाग में &>ओवर के क्लोबर उपयोग की >&फिर से सिफारिश की गई है जिसमें संलग्न करने का केवल एक ही तरीका है bash
  • zshदोनों की अनुमति देता है &>>और >>&रूपों।

यह उत्तर उत्कीर्णित उत्तर की तुलना में बहुत अधिक उपयोगी है।
कातिलों

इसलिए &एक विशेष चरित्र है जो शेल दुभाषिया द्वारा 1 और 2 में परिवर्तित हो जाता है?
फखर मोकामा

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