&> और 2> & 1 के बीच अंतर क्या है


30

वहाँ पुनर्निर्देशन के दो प्रकार हैं मानक आउटपुट और मानक त्रुटि में मानक आउटपुट । लेकिन कौन सा बेहतर है? और क्यों &>सही माना जाता है?

मुझे नहीं पता कि क्या अंतर है ताकि कई ट्यूटोरियल और यहां तक ​​कि मैनुअल स्थिति को &>भी बेहतर कर सकें!

तो मैं क्यों उपयोग करूं &>और क्या नहीं2>&1

मुख्य रूप से bashशेल का उपयोग करना


संपादित करें: टिप्पणीकारों के लिए धन्यवाद

केवल> और csh या tsh में काम करता है

Ksh में केवल 2> और 1 कार्य करता है।

डैश का उपयोग> फ़ाइल 2> और केवल 1 पुनर्निर्देशन

फिर जो मेरी स्क्रिप्ट सुनिश्चित करने के लिए उपयोग किया जाता है वह अन्य प्रणालियों के साथ संगत है जो भी उपयोग किए गए गोले हैं!


बेहतर वही है जो आपको करने की आवश्यकता है। ये बहुत अलग चीजें करते हैं। आप किस शेल का उपयोग कर रहे हैं?
स्कैपरन

@ शकरकंद का उपयोग कर बैश
Maythux

1
आप क्या हासिल करना चाहते हैं?
स्कैपरन

मैं सिर्फ यह जानना चाहता हूं कि क्या अंतर है, जो मैं चाहता हूं वह दोनों में नहीं है, लेकिन मुझे यह जानने की जरूरत है कि क्या अंतर है ताकि एक बार दूसरे पर भरोसा किया जाए
Maythux

2
&> somewhereबस बैश शॉर्टहैंड के लिए > somewhere 2>&1: बैश मैनुअल के शब्दों में, वे "समरूप रूप से समकक्ष" हैं
स्टीलड्रिवर

जवाबों:


23

बैश के मैन पेज में उल्लेख है कि स्ट्रीडर और स्टडआउट को पुनर्निर्देशित करने के दो तरीके हैं : &> file और >& file। अब, ध्यान दें कि यह stderr और stdout दोनों कहता है।

इसके मामले में >file 2>&1हम फ़ाइल करने के लिए stdout (1) का पुनर्निर्देशन कर रहे हैं, लेकिन फिर stderr (2) को उसी स्थान पर stdout के रूप में पुनर्निर्देशित करने के लिए कह रहे हैं! तो उद्देश्य समान हो सकता है, लेकिन विचार थोड़ा अलग है। दूसरे शब्दों में, "जॉन, स्कूल जाना; सूज़ी जहाँ जॉन जाता है"।

वरीयता के बारे में क्या? &>एक bashबात है। इसलिए यदि आप किसी स्क्रिप्ट को पोर्ट कर रहे हैं, तो वह ऐसा नहीं करेगा। लेकिन अगर आप 100% निश्चित हैं कि आपकी स्क्रिप्ट केवल bash के साथ सिस्टम पर काम करेगी - तो कोई वरीयता नहीं है

यहाँ एक उदाहरण है dash, डेबियन एमक्विस्ट शेल जो उबंटू का डिफ़ॉल्ट है।

$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory

जैसा कि आप देख सकते हैं, stderr को पुनर्निर्देशित नहीं किया जा रहा है

प्रश्न में अपने संपादन को संबोधित करने के लिए, यदि आप $ SHELL चर की जाँच करने और तदनुसार रीडायरेक्ट बदलने के लिए कथन का उपयोग कर सकते हैं

लेकिन ज्यादातर मामलों में > file 2>&1काम करना चाहिए


अधिक तकनीकी शब्दों में, फ़ॉर्म [integer]>&wordको डुप्लिकेट आउटपुट फ़ाइल डिस्क्रिप्टर कहा जाता है , और यह POSIX शेल कमांड लैंग्वेज मानक द्वारा निर्दिष्ट एक विशेषता है, जो कि ज्यादातर POSIX-compliant और Brourne जैसे गोले द्वारा समर्थित है।

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


फिर कुछ अन्य गोले पर प्रयोग करने से क्या होता है?
मेथक्स

zsh का समर्थन करता है &>.... @ मेथॉक्स उन गोले में है जो समर्थन नहीं करते हैं &>जैसे dashआपको तुच्छ >file 2>&1पुनर्निर्देशन का उपयोग करने की आवश्यकता है ..
heemayl

फिर अगर मुझे यकीन है कि मेरी स्क्रिप्ट अलग-अलग गोले के साथ संगत होगी, तो कौन सा उपयोग करना है
Maythux

3
@Maythux का उपयोग करें >file 2>&1। सभी गोले पर यह काम
सर्गी कोलोडियाज़नी

1
@ TSJNachos117 /etc/passwdप्रत्येक उपयोगकर्ता के लिए सेट किए गए गोले इंटरैक्टिव गोले हैं। सिस्टम स्क्रिप्ट आमतौर पर dash तब तक के लिए होती है जब तक कि वह निर्दिष्ट न हो। क्या डिफ़ॉल्ट है के रूप में, यह क्या /bin/shउबंटू के मामले में सहानुभूति से निर्धारित होता है dash। आरएचईएल में यह है bash, फ्रीबीएसडी में यह tcsh स्रोत है और एक अन्य स्रोत है
सर्जि कोलोडियाज़नी

6

मैं आम तौर पर बातें करने के बॉर्न-फिर शेल के तरीके का पालन ​​करने की सलाह दूंगा , क्योंकि बैश यकीनन वहां सबसे लोकप्रिय यूनिक्स शेल है। बैश आमतौर पर या तो उपयोग करता है&> या या 2>&1। IMHO, न तो "सही" है, इसलिए मैं उस बकवास के बारे में भूलने की सलाह देता हूं। वास्तविक रूप से, जो आपको उपयोग करना चाहिए वह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

2>&1stderout के साथ stderr को मिलाता है, जो उपयोगी हो सकता है, उदाहरण के लिए, आप stderr पाठ को पाइप करना चाहते हैं। इसलिए, उदाहरण के लिए, यदि आप यह देखना चाहते हैं कि क्या कोई प्रोग्राम एक निश्चित स्टैडर मैसेज को प्रिंट करता है, लेकिन आपकी स्क्रीन को महत्वहीन कचरा से भरा नहीं है, तो आप ऐसा कुछ कर सकते हैंprogram 2>&1 | grep crashed , जो प्रोग्राम से stdout और strr को खोजेगा। "दुर्घटनाग्रस्त" शब्द के लिए "प्रोग्राम" कहा जाता है।

दूसरी ओर, यदि आप किसी भी चीज़ को प्रिंट करने के लिए कोई प्रोग्राम नहीं चाहते हैं, तो आप बस चला सकते हैं program &> /dev/null, जो stderr और stdout दोनों को / dev / null में रीडायरेक्ट करेगा, एक विशेष फ़ाइल जो जादुई रूप से चीजों को गायब कर देती है। या, यदि आप किसी प्रोग्राम के आउटपुट (शायद बग या किसी चीज़ की रिपोर्ट करना चाहते हैं) को सेव करना चाहते हैं, तो आप एक फाइल में stderr और stdout दोनों को रीडायरेक्ट कर सकते हैं: program &> log.txtसभी डेटा को "log.txt" नामक फाइल पर रीडायरेक्ट करेंगे। यदि आप चाहते हैं, तो आप stdout और stderr को पुनर्निर्देशित कर सकते हैं program 2> log.txt > log.txtया program 2>&1 | cat > log.txtदोनों का उपयोग करने के समान प्रभाव होगा &>। यदि आप कुछ ऐसा करते हैं program 2>&1 > file, तो केवल stdout को पुनर्निर्देशित किया जाएगा, लेकिन stderr को अभी भी किसी अन्य प्रोग्राम, जैसे कि कैट, में पाइप किया जा सकता है, जिसे ऊपर दिखाए अनुसार पुनर्निर्देशित किया जा सकता है। हालाँकि, टाइपिंग&>उपरोक्त में से किसी भी उदाहरण से आसान है, क्योंकि इसमें कम अक्षर टाइप करना शामिल है (और यह मनुष्य के लिए पढ़ना आसान है)। ध्यान दें कि program 2> log.txt > log.txtगैर-बैश के गोले पर काम करने की अधिक संभावना हो सकती है।

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

#!/bin/bash

यदि आप किसी दिए गए स्क्रिप्ट की पहली पंक्ति के रूप में उपरोक्त का उपयोग करते हैं, तो आम तौर पर कहा स्क्रिप्ट को निष्पादित करने के लिए बैश का उपयोग किया जाएगा। यह गलत शेल के साथ किसी को गलती से स्क्रिप्ट निष्पादित करने के लिए बहुत अधिक कठिन बना देगा।

पुनश्च: मैं झूठ नहीं बोलने जा रहा हूं: अब तक, मुझे नहीं पता था कि कोई भी उपयोग कर सकता है >&, लेकिन, जहां तक ​​बाश जाता है, वह ऐसा ही करता है &>। आप हर दिन कुछ नया सीखते हैं।


जबकि मैं #!स्पष्ट रूप से अनुरोध करने के लिए लाइन के उपयोग के बारे में आपसे सहमत हूं bash, यह हमेशा अन्य प्रणालियों पर उपलब्ध नहीं है। बहुत बार डेवलपर्स / sysadmins को सिस्टम के लिए पोर्टेबल स्क्रिप्ट लिखना पड़ता है, जिस पर bashउपलब्ध नहीं हो सकता है और यह स्थापित करने के लिए उनके नियंत्रण में नहीं हो सकता है bash। यह >file 2>&1सिर्फ बहुत पोर्टेबल है।
सर्गी कोलोडियाज़नी

आपने ऊपर एक उलट त्रुटि की, जो आपके द्वारा दावा या इच्छित परिणाम का उत्पादन नहीं करता है। Stdout में पुनर्निर्देशित stderr, फिर reddout मूल stdout पर stderr छोड़ देता है।
ubfan1

सर्ग: मेरा मतलब यह नहीं था कि मारना सार्वभौमिक था। हालाँकि, मुझे लगता है कि अधिक लोग इसे (t) csh की तुलना में उपयोग कर रहे हैं। यदि आप नहीं जानते कि कोई और क्या उपयोग कर रहा है, और एक अंधा अनुमान लगाना है, तो बैश शायद आपका सबसे अच्छा दांव है। इसके अलावा, मैं आमतौर पर पोर्टेबिलिटी के बारे में नहीं जानता, क्योंकि मैं केवल बैश का उपयोग करता हूं। तथ्य यह >file 2>&1है कि अधिक पोर्टेबल है पता करने के लिए अच्छा है। मैं इसे दिखाने के लिए एक संपादन करूँगा।
TSJNachos117

Ubfan1, जानकारी के लिए धन्यवाद। मैंने कभी भी एक मिलियन वर्षों में अनुमान नहीं लगाया होगा कि बैश उस मामले में एक फ़ाइल पर stderr को पुनर्निर्देशित नहीं करेगा। मैंने दूसरों को एक ही गलती करने से रोकने के लिए अपना उत्तर संपादित किया है।
TSJNachos117

4

से बैश संदर्भ मैनुअल -> 3.6.4 पुन: निर्देशित स्टैंडर्ड आउटपुट और मानक त्रुटि :

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

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

&>word

तथा

>&word

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

>word 2>&1

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

इनपुट और आउटपुट पर ग्रेग की विकि का संदर्भ लेना अच्छा है -> 4.2। फाइल डिस्क्रिप्टिव मैनीपुलेशन :

सुविधा के लिए, बैश आपके लिए अभी तक पुनर्निर्देशन का दूसरा रूप भी उपलब्ध कराता है। & पुनर्निर्देशन ऑपरेटर वास्तव में हमारे द्वारा किए गए कार्य का एक छोटा संस्करण है [ 2>&1]; किसी फ़ाइल में stdout और stderr दोनों को पुनर्निर्देशित करना।


4

तो मैं &> का उपयोग क्यों करूंगा और 2> और 1 का नहीं

2>&1 मानक बॉर्न / POSIX शेल है।

&>एक बैश एक्सटेंशन है और डी ज्यूर मानक नहीं है।

यदि आप बैश एक्सटेंशन का उपयोग करके स्क्रिप्ट लिखते हैं, तो अभी या बाद में आप क्रिप्टिक सिंटैक्स त्रुटि संदेशों के साथ सिर-खरोंच विफलताओं का सामना करने जा रहे हैं क्योंकि वे एक मानक शेल में चलाए जा रहे हैं।

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