मान लें कि मेरे पास निम्नलिखित पाइप है:
a | b | c | d
मैं कैसे पूरा करने के लिए इंतजार कर सकते हैं c
(या b
) में sh
या bash
? इसका मतलब है कि स्क्रिप्ट d
किसी भी समय शुरू हो सकती है (और इसके लिए प्रतीक्षा करने की आवश्यकता नहीं है) लेकिन c
सही तरीके से काम करने के लिए पूर्ण आउटपुट की आवश्यकता होती है।
उपयोग के मामले में है difftool
के लिए git
है कि छवियों तुलना करती है। इसे git
इसके इनपुट ( a | b | c
भाग) को संसाधित करने और तुलना ( d
भाग) के परिणामों को प्रदर्शित करने की आवश्यकता है । फोन करने वाले इनपुट कि के लिए आवश्यक है को नष्ट करेगा a
और b
। इसका मतलब यह है कि स्क्रिप्ट से लौटने से पहले, प्रक्रिया c
(या b
) को समाप्त करना होगा। दूसरी ओर, मैं इंतजार नहीं कर सकता d
क्योंकि इसका मतलब है कि मैं उपयोगकर्ता इनपुट की प्रतीक्षा कर रहा हूं।
मुझे पता है कि मैं c
एक अस्थायी फ़ाइल के परिणाम लिख सकता हूं , या शायद एक फीफो का उपयोग कर सकता हूं bash
। (निश्चित नहीं कि अगर फीफो मदद करेगा, हालांकि।) क्या यह संभव है बिना अस्थायी फाइलों के इसे हासिल करना sh
?
संपादित करें
शायद यह पर्याप्त होगा अगर मैं एक विश्वसनीय फैशन में प्रक्रिया c
(या b
) की प्रक्रिया आईडी का पता लगा सकता हूं । तब पूरे पाइप को एसिंक्रोनस रूप से शुरू किया जा सकता था, और मैं एक प्रक्रिया आईडी की प्रतीक्षा कर सकता था। की तर्ज पर कुछ
wait $(a | b | { c & [print PID of c] ; } | d)
संपादित करें ^ 2
मुझे एक समाधान मिला है, टिप्पणियाँ (या अभी भी बेहतर समाधान) का स्वागत है।
d
जब भी यह पसंद करने के लिए शुरू करने के लिए स्वतंत्र है, लेकिन c
इससे पहले कि मैं आगे बढ़ सकता हूं समाप्त करने की आवश्यकता है।
d
यह पसंद होने पर शुरू हो सकता है, तो वास्तव में आप किसका इंतजार कर रहे हैं?
d
आउटपुट का उपयोग नहीं करता है, c
तो d
पाइपलाइन का हिस्सा बनाने के लिए कोई मतलब नहीं है । लेकिन यदि आप d
इनपुट का उपयोग करते हैं तो d
अपने इनपुट पर कुछ समय के लिए काम करना चाहिए, इसके बाद आपके दृष्टिकोण के लिए यह सब पढ़कर कोई फर्क नहीं पड़ता है।
d
प्रोसेसिंग शुरू करना चाहते हैं ? जैसा कि यह आता है आप प्रत्येक आउटपुट लाइन को संसाधित करना शुरू नहीं करना चाहते हैं ?c
c
d