मैं कैसे याद रख सकता हूं कि पुनर्निर्देशन का उपयोग कैसे करें?


40

मुझे पता है

  program > /dev/null 2>&1 

कर देता है। यह आउटपुट को रीडायरेक्ट करता है /dev/nullऔर 2>&1इसका मतलब है कि एरर आउटपुट को उसी जगह पर रीडायरेक्ट करना है जहां आउटपुट भेजा गया है।

मेरी समस्या यह है कि मुझे इसे हमेशा याद रखना है क्योंकि मैं इसे कभी याद नहीं करता।

तो, मैं कोशिश &2>1, 1>2&, 1>&2... मैं हर संयोजन जब तक मैं यह गूगल की कोशिश ...

इसे आसानी से याद करने की क्या ट्रिक है?


मेरे पास एक ही मुद्दा है, इसलिए मैं इसे "लंबा" तरीका - दोनों को पुनर्निर्देशित करता हूं program 1> /dev/null 2>/dev/null। कुछ समय हालांकि आपको मिश्रण करने की आवश्यकता होती है stdoutऔर stderrयह देखने के लिए कि वास्तव में क्या चल रहा है - जैसे कि एक जटिल संकलन प्रक्रिया से आउटपुट को एक फ़ाइल पर पुनर्निर्देशित किया जा रहा है। उस स्थिति में, मैं इसे समाप्त करता हूं
ivanivan

जवाबों:


20

आउटपुट त्रुटि से बेहतर है इसलिए यह पहले (1 बनाम 2) आता है।

>'जाता है' के लिए आशुलिपि है। बाईं ओर वह है जिसे मैं भेजना चाहता हूं और दाईं ओर वह है जहां मैं इसे भेजना चाहता हूं। चूंकि 'जहां' (लगभग) हमेशा एक फाइल होती है, कुछ इस तरह

program > /dev/null 2>1

1. नामक एक फ़ाइल पर रीडायरेक्ट करेगा। इस प्रकार, एम्परसैंड (&)फाइल को विवरणक में दर्ज करने के लिए संशोधित करता है।

दुर्भाग्य से, मैं भर में नहीं आया और न ही अपने स्वयं के मेनेनिक विकसित किए, लेकिन जब मैं पहली बार * निक्स सीख रहा था, तो मुझे यह अच्छा काम करने का तार्किक तरीका मिला। कुछ भाग-दौड़ के बाद, यह दूसरी प्रकृति बन जाती है।


आपका पहला वाक्य मेरे लिए मायने नहीं रखता। stdoutफ़ाइल विवरणक 1 है, stderr2 है। इसलिए, "त्रुटि" "आउटपुट" से पहले आता है।
वॉरेन यंग

वह वाक्य याद रखने के लिए एक मुहावरेदार है जो फ़ाइल विवरणक stdoutऔर stderrसंदर्भित करता है।
gvkv

ठीक है, लेकिन यह अभी भी भ्रामक लगता है, क्योंकि मूल प्रश्न "2> और 1" में वर्णों के क्रम को याद करने की कोशिश करने के बारे में है।
वॉरेन यंग

9

एक चाल सिर्फ यह याद रखना है कि 1 = मानक आउटपुट, 2 = मानक त्रुटि। इसलिए:

2>&1= मानक त्रुटि स्ट्रीम मानक आउटपुट स्ट्रीम में जाती है।
1>&2= इसके विपरीत।

यदि आपने कभी सी जैसी भाषा में प्रोग्राम किया है, तो एम्परसैंड ( &) को याद रखना आसान है । मैं इसे "मौजूदा फ़ाइल डिस्क्रिप्टर के पते" के संदर्भ के रूप में सोचने के लिए चुनता हूं, ताकि आप फ़ाइल को स्वयं न बदलें या नया न बनाएं।


7

&एक गाँठ के रूप में देखने से मदद मिल सकती है: 2 के आउटपुट को लेने के रूप में आप क्या करना चाहते हैं, इस बारे में सोचें 2>, और इसे 1 के साथ एक साथ बांध दें, ताकि2>&1


2
मैंने सिर्फ "दो आउट और एक" वाक्यांश को याद किया। चाहे आपका मुनीम एक मुहावरा हो या गाँठ, एक होने से वास्तव में मदद मिलेगी।
टिम कैनेडी

5

दरअसल, यह इस बात पर निर्भर करता है कि आप किस शेल का इस्तेमाल कर रहे हैं। बैश आमतौर पर बहुत क्षमाशील होता है और आप बस कर सकते हैं:

program &> file

5

आइए इन तीन विकल्पों पर विचार करें:

program  2>1
program  2>1& 
program  2>&1

पहला फाइल "1" नाम के स्टैडर को भेजता है: आखिरकार, बैश एक फाइल पर रीडायरेक्ट करने की उम्मीद करता है।

दूसरा भी उसी फ़ाइल पर रीडायरेक्ट करता है, लेकिन programबैकग्राउंड में चलता है: &इसका मतलब यह है कि अनुगामी का मतलब माना जाता है।

तीसरी संभावना को केवल एक के रूप में छोड़ देता है जो एक फ़ाइल हैंडल पर रीडायरेक्ट करने के लिए बैश ब्रह्मांड में समझ में आता है।

कैसे याद रखें जो 0, 1, 2 के बीच है? कंसोल से कंप्यूटर चलाने के बारे में सोचें। सबसे पहले, आपको कुछ लिखना होगा (0 = स्टडिन)। फिर, आप आउटपुट (1 = stdout) देखते हैं। अंत में और केवल अगर कुछ गलत हो जाता है, तो आप stderr (2) देखते हैं।


1

इसे अपने वॉलपेपर में ड्रा करें।

अब, गंभीरता से, यह और अन्य बुनियादी चीजें जिन्हें मैं भूल गया था, इसलिए मैंने अपने द्वारा विकसित किए गए ऐप में एक त्वरित सुझाव मेनू जोड़ा और मैं दैनिक उपयोग करता हूं। आप इसे नोट करने के लिए कोशिश कर सकते हैं या नोट की तरह उपयोग कर सकते हैं।


1

बैश शेल के संबंध में मुझे याद रखने का सबसे अच्छा तरीका यह है कि यह समझने के लिए कि क्या हो रहा है।
यदि आप सभी को यह याद रखना है कि कमांड को सही कैसे किया जाए, तो आप कोशिश कर सकते हैं

program > /results 2> /results

यह अच्छा और स्पष्ट व्हाट्सएप चल रहा है और याद रखना आसान है। अर्थात

  • 1 STDOUT जा रहा है /results
  • 2STDERR भी सीधे जा रहा है/results

समस्या यह है कि आप अपेक्षा के अनुरूप काम नहीं करेंगे। निम्नलिखित को धयान मे रखते हुए:

फ़ाइल: /tmp/poem.txt

the quick brown fox jumped over the lazy dog

और कमांड चलाएँ

grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results

फिर

$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
 lazy dog

यहाँ क्या हुआ?
मेरी समझ बैश सेटअप है जो फ़ाइल को सीधे STDERR को इंगित करने वाले पुनर्निर्देशन की /tmp/resultsवजह से है और इसकी प्रकृति के कारण >2 चीजें हैं

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

तो इस मामले में STDERR, /tmp/resultsSTDOUT के आउटपुट को ओवरराइड करने की शुरुआत में सीधे सम्मिलित करता है ।
नोट: यदि आप >>संलग्न करते थे तो आप शायद इस वाक्य रचना के साथ दूर हो सकते थे।
हालाँकि आपको जो समस्या है उसे ठीक करने के लिए - STDERR को रीडायरेक्ट करने के लिए नहीं - सीधे फाइल में, बल्कि STDERR के आउटपुट को STDOUT स्ट्रीम में मर्ज करने के लिए , ताकि आपको टक्कर न मिले।
ऑपरेटर 2>&1ऑपरेटर का उपयोग करने से यह प्राप्त होता है

grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1

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

अधिक जानकारी के लिए देखें - http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection

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