पुनर्निर्देश का आदेश


29

मैं यह नहीं समझता कि कंप्यूटर इस कमांड को कैसे पढ़ता है।

cat file1 file2 1> file.txt 2>&1

अगर मैं समझता हूं, तो 2>&1बस मानक त्रुटि को मानक आउटपुट पर पुनर्निर्देशित करें।

उस तर्क से, कमांड मुझे इस प्रकार पढ़ता है:

  1. समतल फ़ाइलें file1और file2

  2. stdoutइस ऑपरेशन से भेजें file.txt

  3. भेजने stderrके लिए stdout

  4. समाप्त?

मुझे यकीन नहीं है कि कंप्यूटर क्या कर रहा है। मेरे तर्क से, कमांड होना चाहिए

cat file1 file2 2>&1 > file.txt

लेकिन यह सही नहीं है।

जवाबों:


46

मुझे असाइनमेंट का उपयोग करने के बारे में सोचना आसान लगता है।

  • > के समान ही =
  • & के समान ही $

तुम बाहर शुरू करो

1 = /dev/tty
2 = /dev/tty

तब आपका पहला उदाहरण 1> file.txt 2>&1, करता है

1 = file.txt
2 = $1           # and currently $1 = file.txt

आपका साथ छोड़ रहा है

1 = file.txt
2 = file.txt

यदि आप इसे दूसरे तरीके से करते हैं, तो आप फिर से शुरू करते हैं

1 = /dev/tty
2 = /dev/tty

तब 2>&1 > file.txtकरता है

2 = $1           # and currently $1 = /dev/tty
1 = file.txt

तो अंतिम परिणाम है

1 = file.txt
2 = /dev/tty

और आपने केवल पुनर्निर्देशित किया है stdout, नहीं stderr


मैं सादृश्य प्राप्त करता हूं, लेकिन यह भ्रमित करता है - इसके लिए क्या $स्टैंड है?
एलिरन मलका

एक असाइनमेंट में var=$othervar, $दाहिने हाथ की तरफ चर नाम का परिचय देता है। जैसे पुनर्निर्देशन में 2>&1, &दाएं हाथ की तरफ फ़ाइल डिस्क्रिप्टर नंबर का परिचय देता है। मैं कह रहा हूँ कि आप इसके बारे में सोच सकते हैं जैसे "फ़ाइल 2 बराबर फ़ाइल 1"। (लेकिन बराबरी के दो प्रकार हैं: <"पढ़ने के लिए" और >"लिखने के लिए " का अर्थ है।)
मिकेल

12

पुनर्निर्देशन का क्रम महत्वपूर्ण है, और उन्हें दाएं से बाएं पढ़ा जाना चाहिए ।

उदाहरण के लिए: का command 2>&1 >somefileअर्थ है:

  1. stderr( इस बिंदु पर, टर्मिनल) 2के वर्तमान गंतव्य पर पुनर्निर्देशित (अर्थात् stdout)।
  2. फिर बदलने के stdoutलिए जाना somefile

तो इस मामले में, stderrटर्मिनल पर stdoutजाता है , और एक फ़ाइल में जाता है, जो कि आप शायद नहीं चाहते हैं।

दूसरी ओर, का command >somefile 2>&1अर्थ है:

  1. पुन: निर्देशित stdoutकरने के लिएsomefile
  2. फिर ( ) stderrके समान गंतव्य पर पुनर्निर्देशित करें ।stdoutsomefile

इस अंतिम स्थिति में दोनों stderrऔर stdoutजाते हैं somefile, जो शायद आप चाहते हैं।


4
cat file1 file2 1> file.txt 2>&1

>& वास्तव में डुप्लिकेट का मतलब है, यह पहले से ही खोली गई फ़ाइल पर एक नई फ़ाइल डिस्क्रिप्टर को मैप करने के लिए डुप सिस्टम कॉल का उपयोग करता है।

इसलिए, आपको (वास्तव में बैश) पहले नया स्टैडआउट खोलना होगा, "जो भी स्टडआउट वर्तमान में सेट किया गया है, उसे रीडायरेक्ट करें।"


यह कमाल का है! मैं उसके बारे में सोच रहा था &। क्या आप उस सिंटैक्स के कुछ संदर्भों को संलग्न कर सकते हैं, या - अभी तक बेहतर - उपर्युक्त डुबकी प्रणाली पर कुछ अच्छे संसाधन?
एलिरन मलका

1
'मैन ड्यूप' सिस्टम कॉल को दस्तावेज करता है।
एक्स तियान

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