हां, 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
।