2012-03-04 30 views
20

पाइपिंग और पुनर्निर्देशन के बीच सटीक अंतर क्या है?पाइपिंग और रीडायरेक्शन

हमें पाइपिंग का उपयोग कहां करना चाहिए और हमें पुनर्निर्देशन का उपयोग कहां करना चाहिए?

वे आंतरिक रूप से कैसे काम करते हैं?

उत्तर

22

रीडायरेक्शन फ़ाइलों के लिए (अधिकतर) (आप फ़ाइलों को स्ट्रीम/रीडायरेक्ट करते हैं)।

पाइपिंग प्रक्रियाओं के लिए है: आप एक प्रक्रिया से दूसरी प्रक्रिया में पाइप (रीडायरेक्ट) स्ट्रीम करते हैं।

अनिवार्य रूप से आप वास्तव में क्या करते हैं एक प्रक्रिया के एक मानक धारा (आमतौर पर stdout) को एक प्रक्रिया के मानक स्ट्रीम (आमतौर पर stdin) के माध्यम से पाइप के माध्यम से "कनेक्ट" करता है। अन्य (अभी तक) लिखने के लिए कुछ भी नहीं है या जब पढ़ने प्रक्रिया काफी तेजी से (जब पाइप के बफर है नहीं पढ़ सकते है, जब वे एक प्रक्रिया (पढ़ने पर) ब्लॉक:

पाइप्स भी तुल्यकालन "पक्ष प्रभाव" हो सकता पूर्ण)।

1

पुनर्निर्देशन: एक फ़ाइल उदाहरण के लिए एक आदेश के उत्पादन (stdout और/या stderr) भेजें: ls > your_fileyour_file

पाइपिंग नाम की एक फ़ाइल के लिए निर्देशिका लिस्टिंग के परिणाम लिखें: एक और आदेश के लिए उत्पादन भेजें। उदाहरण ls | wc उसी आउटपुट (निर्देशिका लिस्टिंग) को wc पर भेजें जो वर्णों की गणना करता है।

6

पाइपिंग किसी प्रोग्राम के आउटपुट को किसी अन्य प्रोग्राम में निर्देशित करता है।

उदाहरण के लिए:

ls * | grep "name" 

पाइप्स सभी फ़ाइलों के नाम वर्तमान निर्देशिका में grep करने के लिए। पुन: दिशा निर्देश फ़ाइल को आउटपुट या जोड़ती है।

ls * > file # writes all file names in current directory to the "file" 
ls * >> file # appends all files names in current directory to the "file" 

पाइपिंग आप एक फ़ाइल पर लिखने में करने की परेशानी की बचत होती है, तो एक अन्य कार्यक्रम के उत्पादन पर एक कार्यक्रम पर अमल करने के लिए फ़ाइल से पढ़ें।

ls * > file 
grep "name" file 

ls * | grep "name" 

के बराबर है कि यह कैसे वे आंतरिक रूप से काम के लिए के रूप में है, मैं सिर्फ यह है कि मेरे आत्म अब सीख रहा हूँ। लेकिन मुझे यह लिंक मिला जो इस पर कुछ चर्चा प्रदान करता है।

How Does Piping Work in Linux?

यदि आप कार्यक्रमों के बीच आउटपुट पास करना चाहते हैं आप पाइपिंग का उपयोग करना चाहिए; यदि आप किसी फ़ाइल में लिखना चाहते हैं तो पुनर्निर्देशन का उपयोग करें।

0

मूल रूप से पुनर्निर्देशन और पाइपिंग यूनिक्स में इंटर प्रोसेस संचार प्राप्त करने के लिए कई तरीकों से हैं।

  1. पुनर्निर्देशन: डेटा को पत्र लिखा और एक ठेठ UNIX फ़ाइल से पढ़ा जाता है। प्रक्रियाओं की कोई भी संख्या अंतःक्रिया कर सकती है। बड़े डेटा सेट साझा करते समय इसका उपयोग किया जाना चाहिए।

ls > FileName

  1. पाइपिंग: पाइपिंग एक प्रक्रिया है जहां एक प्रक्रिया के उत्पादन में एक और के इनपुट किया जाता है। वे यूनिक्स ऑपरेटिंग सिस्टम के सबसे आदिम रूपों में विकसित हुए थे। वे एक ही प्रणाली के भीतर प्रक्रियाओं के बीच संचार का एकजुट प्रवाह प्रदान करते हैं। पाइप सिस्टम कॉल का आह्वान करके एक पाइप बनाया जाता है, जो फाइल डिस्क्रिप्टर की एक जोड़ी बनाता है। [फ़ाइल के लिए वर्णनकर्ता पढ़ http://www.bottomupcs.com/file_descriptors.html]

ls | grep $myName

यह उत्पादक और उपभोक्ता के रूप में सरल डेटा साझा करने, पर काम करता है।

संपत्ति तुलना: पाइपिंग हमेशा एक-दिशात्मक है जबकि इनपुट के साथ-साथ आउटपुट को पुनर्निर्देशित करने के लिए पुनर्निर्देशन का उपयोग किया जा सकता है।

ls > grep myFileName [प्रकार को आदेश एक इनपुट के रूप पुन: निर्देशित filename.txt फ़ाइल] sort < fileName.txt [बाद में एक के लिए पहले आदेश के उत्पादन में रीडायरेक्ट कर रहा है]

एक भी एकल बयान में द्वि-दिशात्मक रीडायरेक्ट का उपयोग करने के नीचे लिख सकते हैं।

sort <fileName.txt> sortNewFile.txt

जबकि Piping, यह हमेशा पहले आदेश बाद में एक और simulanoeously है कि आपूर्ति के उत्पादन में है।

ls | grep myName | awk '{ print $NF }' [एक सिंगल स्टेटमेंट में एक से अधिक पाइपिंग]

नोट 1:command > fileName। यदि fileName नामक कमांड है, तो वह रीडायरेक्शन का उपयोग करके बहुत कठिन और अधिक त्रुटि प्रवण होगा। किसी को पहले जांच करनी चाहिए, भले ही गंतव्य फ़ाइल नामक कमांड हो।

अन्य यूनिक्स प्रणाली में भारतीय दंड संहिता को प्राप्त करने के तरीके हैं:

  1. नाम पाइप
  2. सिग्नल
  3. साझा स्मृति
  4. सॉकेट
+0

धन्यवाद! अच्छी तरह से समझाया। – edge

1

मैं देखा है कि पाइपलाइनिंग प्रक्रिया प्रतिस्थापन के उत्पादन पर लागू होता है, लेकिन नहीं पुनर्निर्देशन:

bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) | cat > pipe 
bash-3.2$ echo $'one\ntwo\nthree' | tee >(grep o) > redirect 
bash-3.2$ one 
two 

bash-3.2$ cat pipe 
one 
two 
three 
one 
two 
bash-3.2$ cat redirect 
one 
two 
three 
संबंधित मुद्दे