हां, bashजैसे कि ksh(जहां से फीचर आता है), प्रक्रिया प्रतिस्थापन के अंदर की प्रक्रियाओं का इंतजार नहीं किया जाता है (स्क्रिप्ट में अगली कमांड चलाने से पहले)।
एक के लिए <(...)एक, आमतौर पर ठीक है कि के रूप में:
cmd1 <(cmd2)
शेल की प्रतीक्षा की जाएगी cmd1और cmd1आमतौर पर cmd2इसके पढ़े जाने के पुण्य से इंतजार किया जाएगा, जब तक कि प्रतिस्थापित होने वाले पाइप पर फ़ाइल का अंत नहीं हो जाता है, और अंत में फ़ाइल आमतौर पर तब होती है जब उसकी cmd2मृत्यु हो जाती है। यही कारण है कि इसी कारण से कई गोले (नहीं है bash) के लिए इंतज़ार कर परेशान नहीं है cmd2में cmd2 | cmd1।
के लिए cmd1 >(cmd2), हालांकि, कि आम तौर पर ऐसा नहीं है, के रूप में यह और भी है cmd2कि आम तौर पर के लिए इंतजार कर रहा है cmd1के बाद आम तौर पर बाहर हो जाएगा वहाँ बहुत।
इसमें तय किया गया है zshकि cmd2वहां इंतजार किया जाता है (लेकिन अगर आप इसे नहीं लिखते हैं cmd1 > >(cmd2)और cmd1बिल्ट नहीं है, तो {cmd1} > >(cmd2)इसके बजाय दस्तावेज़ के रूप में उपयोग करें )।
kshडिफ़ॉल्ट रूप से प्रतीक्षा नहीं करता है, लेकिन आपको इसे waitबेसिन के साथ प्रतीक्षा करने देता है (यह भी पीआईडी को उपलब्ध कराता है $!, हालांकि यह आपके लिए मदद नहीं करता है cmd1 >(cmd2) >(cmd3))
rc( cmd1 >{cmd2}सिंटैक्स के साथ ), उसी तरह जैसे kshआप सभी पृष्ठभूमि प्रक्रियाओं के साथ प्राप्त कर सकते हैं $apids।
es(के साथ भी cmd1 >{cmd2}) की cmd2तरह इंतजार कर रहा है zsh, और प्रक्रिया पुनर्निर्देशन cmd2में भी इंतजार कर रहा है <{cmd2}।
bashकी उप-धारा cmd2(या इससे अधिक बिल्कुल उप-भाग के रूप में) बनाता है, क्योंकि यह उस उप-भाग cmd2की एक बाल प्रक्रिया में चलता है, भले ही यह वहां अंतिम कमांड हो) उपलब्ध है $!, लेकिन आपको इसके लिए प्रतीक्षा नहीं करने देता।
यदि आपको उपयोग करना है bash, तो आप एक कमांड का उपयोग करके समस्या के आसपास काम कर सकते हैं जो दोनों कमांड के लिए इंतजार करेगा:
{ { cmd1 >(cmd2); } 3>&1 >&4 4>&- | cat; } 4>&1
यह दोनों बनाता है cmd1और cmd2उनके fd 3 एक पाइप के लिए खुला है। catअंत फ़ाइल दूसरे छोर पर के लिए इंतजार करेंगे, तो आम तौर पर केवल बाहर निकलने जब दोनों जाएगा cmd1और cmd2मर चुके हैं। और शेल उस catकमांड का इंतजार करेगा । आप यह देख सकते हैं कि सभी पृष्ठभूमि प्रक्रियाओं की समाप्ति को पकड़ने के लिए एक जाल के रूप में (आप इसे पृष्ठभूमि में शुरू की गई अन्य चीजों के लिए उपयोग कर सकते हैं &, जैसे कि सहपाठियों या यहां तक कि यह कि वे स्वयं पृष्ठभूमि प्रदान करते हैं, वे अपने सभी फ़ाइल विवरणों को बंद नहीं करते हैं जैसे कि डेमॉन आमतौर पर करते हैं। )।
ध्यान दें कि उपर्युक्त उस व्यर्थ उपशमन प्रक्रिया के लिए धन्यवाद, यह काम करता है भले ही cmd2इसकी fd 3 बंद हो जाए (कमांड आमतौर पर ऐसा नहीं करते हैं, लेकिन कुछ पसंद करते हैं sudoया sshकरते हैं)। भविष्य के संस्करण bashअंततः अन्य गोले की तरह वहाँ अनुकूलन कर सकते हैं। फिर आपको कुछ इस तरह की आवश्यकता होगी:
{ { cmd1 >(sudo cmd2; exit); } 3>&1 >&4 4>&- | cat; } 4>&1
यह सुनिश्चित करने के लिए कि अभी भी एक अतिरिक्त शेल प्रक्रिया है, जिसमें fd 3 उस sudoकमांड की प्रतीक्षा कर रहा है ।
ध्यान दें कि catकुछ भी नहीं पढ़ेगा (क्योंकि प्रक्रियाएं अपने fd 3 पर नहीं लिखती हैं)। यह सिर्फ सिंक्रनाइज़ेशन के लिए है। यह सिर्फ एक read()सिस्टम कॉल करेगा जो अंत में कुछ भी नहीं के साथ वापस आ जाएगा।
आप वास्तव catमें पाइप सिंक्रनाइज़ेशन करने के लिए कमांड प्रतिस्थापन का उपयोग करके चलने से बच सकते हैं :
{ unused=$( { cmd1 >(cmd2); } 3>&1 >&4 4>&-); } 4>&1
इस बार, यह इसके बजाय शेल catहै जो पाइप से पढ़ रहा है जिसका दूसरा छोर fd 3 cmd1और पर खुला है cmd2। हम एक चर असाइनमेंट का उपयोग कर रहे हैं ताकि बाहर निकलने की स्थिति cmd1उपलब्ध हो $?।
या आप हाथ से प्रक्रिया प्रतिस्थापन कर सकते हैं, और फिर आप अपने सिस्टम का उपयोग भी कर सकते हैं shजो कि मानक शेल सिंटैक्स बन जाएगा:
{ cmd1 /dev/fd/3 3>&1 >&4 4>&- | cmd2 4>&-; } 4>&1
हालाँकि, जैसा कि पहले नोट किया गया था कि सभी shकार्यान्वयन समाप्त cmd1होने के बाद इंतजार नहीं करेंगे cmd2(हालांकि यह दूसरे तरीके से बेहतर है)। उस समय, $?के बाहर निकलने की स्थिति शामिल है cmd2; हालांकि bashऔर zshमेकअप cmd1के बाहर निकलने में उपलब्ध स्थिति ${PIPESTATUS[0]}और $pipestatus[1]क्रमश: (यह भी देखें pipefailकुछ गोले में विकल्प तो $?पिछले अलावा अन्य पाइप घटकों की विफलता रिपोर्ट कर सकते हैं)
ध्यान दें कि yashइसकी प्रक्रिया पुनर्निर्देशन सुविधा के साथ समान समस्याएं हैं। वहाँ cmd1 >(cmd2)लिखा जाएगा cmd1 /dev/fd/3 3>(cmd2)। लेकिन cmd2इसके लिए इंतजार नहीं किया जाता है और आप इसके waitलिए प्रतीक्षा करने के लिए उपयोग नहीं कर सकते हैं और इसका पीड $!चर में भी उपलब्ध नहीं कराया गया है। आप के लिए के रूप में चारों ओर एक ही काम का उपयोग करेंगे bash।