2013-02-05 41 views
7

कहो की stdin के लिए दोनों से परिणाम इकट्ठा मैं तीन कार्यक्रम है: जनरेटर, कि प्रोसेसर और सत्यापनकर्ता को खिलाया इनपुट डेटा की जांच कर सकते हैं कि अगर प्रोसेसर का उत्पादन आउटपुट दिए गए इनपुट के लिए सही है (इसलिए इसे दोनों फाइलों की आवश्यकता है)।डुप्लिकेट stdout, दो अलग अलग आदेश के पाइप यह अंतिम कार्यक्रम

क्या मैं वर्तमान में करते हैं:

जनरेटर> in.txt & & प्रोसेसर <> in.txt out.txt out.txt in.txt & & बिल्ली | सत्यापनकर्ता

क्या स्पष्ट फ़ाइलों का उपयोग किए बिना एक ही परिणाम प्राप्त करना संभव है? मैंने टीई और प्रक्रिया प्रतिस्थापन का उपयोग करके इनपुट डुप्लिकेट करने के बारे में पढ़ा है, लेकिन मुझे अंतिम चरण के लिए दोनों धाराओं को एकल में एकत्र करने का कोई तरीका नहीं मिला।

generator | processor | verifier 

नहीं तो आप इस

generator | tee in.txt | processor | verifier in.txt 

टी आदेश का उपयोग कर सकते हैं:

उत्तर

1

आप उत्पादन क्रमिक रूप से stdin तो stdout को प्रोसेसर कोड बदल सकते हैं एक पंक्ति का आदेश इस रूप में सरल किया जा सकता stdout डुप्लिकेट करें और एक स्ट्रीम को in.txt पर रीडायरेक्ट करें और दूसरी अगली पाइप की ओर। stdin से processor के आउटपुट को पढ़ने के लिए verifier को generator द्वारा उत्पन्न फ़ाइल पैरामीटर के रूप में पारित की गई है।

मुझे पता है तुम एक विधि खोज कर रहे हैं नकल और stdout को stdin रीडायरेक्ट करने के लिए, लेकिन मैं इस के बारे में पता नहीं कर रहा हूँ और ईमानदारी से मुझे नहीं लगता कि यह संभव

+1

मुझे लगता है कि मैं इस दृष्टिकोण की कोशिश की, और यह काम नहीं किया कोई गारंटी नहीं कि in.txt द्वारा लिखित रूप से किया जाएगा क्योंकि वहाँ सत्यापनकर्ता पहले इसे पढ़ना शुरू कर देता है (इसलिए यह खाली फ़ाइल पढ़ने समाप्त हो गया)। –

+0

इनपुट पैरामीटर की वैधता को सत्यापित करने के लिए यह हर प्रक्रिया का कर्तव्य है। अगर इनपुट पैरामीटर अमान्य हैं तो बस वापस आएं। –

+0

@ किमस्ट्रॉस, अगर आप 'जेनरेटर' और 'प्रोसेसर' लाइनों के बीच 'सिरिफायर' के बीच कुछ सिंक्रनाइज़ेशन चाहते हैं, तो आपको इंटरफेविंग करने के लिए 'प्रोसेसर' की व्यवस्था करनी होगी। अन्यथा डेविडबेरा द्वारा दिए गए उत्तरों के साथ कुछ करें: स्टफ आउटपुट कहीं और, दोनों पर 'सत्यापनकर्ता' को कॉल करें। – vonbrand

2

है आप बनाना नहीं चाहते, तो है आपकी धीमी हार्ड डिस्क पर वास्तविक फ़ाइलें, आप एफआईएफओ (फर्स्ट इन फर्स्ट आउट) का उपयोग कर सकते हैं, जिन्हें उनके व्यवहार के कारण नामित पाइप भी कहा जाता है।

mkfifo myfifo 
generator | tee myfifo | processor | verifier myfifo 

यह tee करने के लिए उत्पन्न सामग्री है, जो यह myfifo करने और stdout, जो verifier को processor के माध्यम से पहुंचाया जाता है करने के लिए डुप्लिकेट धाराओं। और verifier भी myfifo से स्ट्रीम प्राप्त करता है।

2

मैं इस परीक्षण नहीं किया है, लेकिन कोशिश:

{ generator | tee /dev/stderr | processor ; } 2>&1 | verifier 

यह stderr को generator उत्पादन की एक प्रति पर पहुंच जाएंगे। फिर stdoutgenerator पर चलाएं। फिर & पाइप verifier दोनों को गठबंधन करें।

हालांकि, यह आदेश की गारंटी नहीं दे सकता है, जिसमें जनरेटर & प्रोसेसर से लाइनें सत्यापनकर्ता तक पहुंच जाएंगी।


वैकल्पिक रूप से, आप नीचे दिए गए जैसे प्रक्रिया प्रतिस्थापन की कोशिश कर सकते हैं:

(generator | tee >(processor)) | verifier 
+1

अंतिम एक सुंदर है। – ffledgling