मुझे बैश स्क्रिप्ट में पर्यावरण चर में कुछ कॉन्फ़िगरेशन डेटा पढ़ने की आवश्यकता है।बैश कॉप्रोक और बचे हुए कॉप्रोक आउटपुट
"स्पष्ट" (लेकिन गलत) पैटर्न है:
egrep "pattern" config-file.cfg | read VAR1 VAR2 VAR3 etc...
यह विफल रहता है क्योंकि read
एक subshell में चलाया जाता है और इसलिए प्रेरक खोल में चर सेट नहीं कर सकता। तो मैं इसे वैकल्पिक विकल्प के रूप में आया
coproc egrep "pattern" config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
जो ठीक काम करता है।
परीक्षण करने के लिए क्या होता है अगर coprocess एक से अधिक पंक्ति देता है, मैंने कोशिश की यह:
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 etc...
जहां config-file.cfg
तीन लाइनों में शामिल है।
$ cat config-file.cfg
LINE1 A1 B1 C1
LINE2 A2 B2 C2
LINE3 A3 B3 C3
मुझे उम्मीद है कि यह फ़ाइल में पहली पंक्ति को संसाधित करने के लिए, किसी प्रकार का "टूटा हुआ पाइप" त्रुटि संदेश होगा। जबकि यह पहली पंक्ति को संसाधित करता है, वहां कोई त्रुटि संदेश नहीं था और कोई कॉप्रोसेस नहीं चल रहा था।
$ cat test.sh
coproc cat config-file.cfg
read -u ${COPROC[0]} VAR1 VAR2 VAR3 VAR4
echo $VAR1 $VAR2 $VAR3 $VAR4
wait
echo $?
यह चल रहा है::
$ bash -x test.sh
+ read -u 63 VAR1 VAR2 VAR3 VAR4
+ cat config-file.cfg
LINE1 A1 B1 C1
+ wait
+ echo 0
0
शेष दो पंक्तियों कहाँ गए थे
तो मैं तो एक स्क्रिप्ट में निम्नलिखित की कोशिश की? मैं या तो "टूटा हुआ पाइप", या wait
लटकने की उम्मीद करता था क्योंकि शेष रेखाओं को पढ़ने के लिए कुछ भी नहीं था, लेकिन जैसा कि आप देख सकते हैं कि रिटर्न कोड शून्य था।
जब तक कि मुझे कुछ याद नहीं आ रहा है, 'कुछ पढ़ें VAR1 VAR2 VAR3 <<(egrep "पैटर्न" config-file.cfg)' पर्याप्त होगा, नहीं? –
@ शॉनचिन: यह प्रश्न को अनदेखा कर रहा है। कॉप्रॉक्स अच्छे अच्छे कारण हैं कि ओपी को पहले – sehe
को समझाना नहीं है मेरी अज्ञानता को क्षमा करें। मैं मानता हूं कि कॉप्रॉक्स शांत हैं, लेकिन टिप्पणी एक गुजरने वाले विचार की प्रतिक्रिया थी कि कॉप्रोक्स एक ओवरकिल हो सकता है अगर यह केवल एक सबहेल में चलने और वर्रों को खोने से बचने के लिए है। मैं शायद सामान्य रूप से गलत हूँ। –