2010-11-06 7 views
35

में नामित पाइप का उपयोग करने का उदाहरण क्या कोई लिनक्स में बैश में नामित पाइप का उपयोग करने का एक सरल उदाहरण पोस्ट कर सकता है?लिनक्स बैश

+0

कोई विशिष्ट भाषा? – slashmais

उत्तर

64

एक नामित पाइप का एक व्यावहारिक उपयोग की सबसे अच्छा उदाहरण के ...

http://en.wikipedia.org/wiki/Netcat

एक अन्य उपयोगी व्यवहार से एक प्रॉक्सी के रूप में netcat उपयोग कर रहा है। दोनों बंदरगाहों और मेजबानों को पुनर्निर्देशित किया जा सकता है। इस उदाहरण को देखो:

nc -l 12345 | nc www.google.com 80 

पोर्ट 12345 अनुरोध का प्रतिनिधित्व करता है इस बंदरगाह 12345 पर एक nc सर्वर शुरू होता है और सभी कनेक्शनों google.com:80 पर पुनः निर्देशित मिलता है। यदि कोई वेब ब्राउज़र एनसी के लिए अनुरोध करता है, तो अनुरोध Google को भेजा जाएगा लेकिन प्रतिक्रिया वेब ब्राउज़र पर नहीं भेजी जाएगी। ऐसा इसलिए है क्योंकि पाइप यूनिडायरेक्शनल हैं। यह इनपुट और आउटपुट को पुनर्निर्देशित करने के लिए नामित पाइप के साथ काम किया जा सकता है।

mkfifo backpipe 
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe 
+31

एक शेल एक-लाइनर के साथ लागू प्रॉक्सी। किसी ने मुझे नहीं बताया कि यह * * * कर सकता है। –

+3

अच्छा ... मुझे लगता है कि यह वास्तव में एक दो लाइनर है ... – hft

+3

@hft कैसे 'mkfifo backpipe के बारे में; एनसी -एल 12345 0 <बैकपाइप | एनसी www.google.com 80 1> बैकपाइप'? – Levi

18

यहाँ आदेशों हैं:

$ mkfifo named_pipe 

$ echo "Hi" > named_pipe & 

$ cat named_pipe 

पहले आदेश पाइप पैदा करता है।

दूसरा आदेश पाइप (अवरुद्ध) को लिखता है। & इसे पृष्ठभूमि में डालता है ताकि आप एक ही खोल में कमांड टाइप करना जारी रख सकें। अगली कमांड द्वारा फीफो खाली होने पर यह बाहर निकल जाएगा।

अंतिम आदेश पाइप से पढ़ता है।

+7

मैं # से $ बदलूंगा, इसलिए इसकी सभी टिप्पणी नहीं की गई (और रूट के रूप में नहीं चलती!) – alternative

+1

यह दिखाने के लिए है कि यह एक शेल प्रॉम्प्ट है! – Khaled

+3

यह रूट प्रॉम्प्ट (यानी रूट रूट में एक प्रॉम्प्ट) को संदर्भित करने के लिए "#" के लिए प्रथागत है। यहां कुछ भी नहीं है जिसके लिए रूट खोल में चलने की आवश्यकता होगी। – thomasrutter

21

दो अलग-अलग खोल खोलें, और उन्हें एक तरफ छोड़ दें। दोनों में,/tmp/निर्देशिका

cd /tmp/ 

पर जाने के पहले एक प्रकार में:

mkfifo myPipe 
echo "IPC_example_between_two_shells">myPipe 

दूसरा एक में, प्रकार:

while read line; do echo "What has been passed through the pipe is ${line}"; done<myPipe 

पहले खोल नहीं देंगे जब तक आप दूसरे शेल में कोड के दूसरे भाग को निष्पादित नहीं करते हैं तब तक आप कोई संकेत वापस लेते हैं। ऐसा इसलिए है क्योंकि फीफो पढ़ने और लिखना अवरुद्ध है।

आप ls -al myPipe करके एफआईएफओ प्रकार को भी देख सकते हैं और इस विशिष्ट प्रकार की फ़ाइल का विवरण देख सकते हैं।

अगला चरण कोड को एक स्क्रिप्ट में शुरू करना होगा! - आशा करता हूँ की ये काम करेगा।

+0

क्या यह गैर-अवरुद्ध फीफो को लिखने के लिए सकारात्मक है? – dabicho