विरासत प्रणाली में से एक को bash4 में अपग्रेड कर दिया गया है और इसकी अधिकांश स्क्रिप्ट काम करना बंद कर दिया है। मैंने <(cmdA ...|cmdB ... file{1,2}|cmdZ ...)
के भीतर एक घुंघराले ब्रैकेट का विस्तार कैसे किया है, इसे नीचे संकुचित कर दिया है।क्यों bash4 घुंघराले ब्रेसिज़ को अलग-अलग फैलाता है?
से पहले (बैश 3.2.25):
[[email protected]:~]$ bash -version|head -1
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
[[email protected]:~]$ cat <(echo sort file{1,2})
sort file1
sort file2
[[email protected]:~]$ join <(sed 's/\r//g;s/^[^:]*://' file{1,2}|LANG=C sort)
[[email protected]:~]$
के बाद (बैश 4.1.2):
अंतर बेहतर उदाहरण देकर स्पष्ट करने
[[email protected]:~]$ bash --version|head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
[[email protected]:~]$ cat <(echo sort file{1,2})
sort file1 file2
[[email protected]:~]$ join <(sed 's/\r//g;s/^[^:]*://' file{1,2}|LANG=C sort)
join: missing operand after `/dev/fd/63'
Try `join --help' for more information.
[[email protected]:~]$
यह एक "कड़ी मेहनत से है कोडित "(और अपेक्षित?) bash4 के लिए किए गए परिवर्तन? या कुछ विस्तार-स्तर सेटिंग्स (जैसे/set +B
) द्वारा नियंत्रित इस विस्तार का व्यवहार है और इसे पुरानी/विरासत/bash3 मोड में वापस स्विच किया जा सकता है? मैं बदले में कुछ शेल-वाइड स्विच बदलूंगा (स्क्रिप्ट के ढेर को फिर से लिखने के बजाय)।
यदि यह (bash3) "सुविधा" एक बग सुधार या सुधार के दौरान काटा गया था - क्योंकि वर्ष (bash3) वाक्य रचना टाइपिंग पर एक टन बचाने के लिए अनुमति दी मैं हैरान हूँ ...
ओह, प्रतीक्षा करें। आप दो अलग-अलग * प्रक्रिया प्रतिस्थापन * उत्पन्न होने की उम्मीद करते हैं, न कि 'sed' के लिए दो तर्क? मुझे नहीं पता कि यह ** ** ** सही, दस्तावेज व्यवहार के अनुरूप था ... जो कहने के लिए है, AFAIK, आपका कोड एक बग पर निर्भर था। –
@ चार्ल्सडफी - इस तरह यह हमेशा काम करता है (मेरे लिए और स्क्रिप्ट्स) bash4 अपग्रेड तक - '<(cmd {a, b}) 'को दो' <(cmd a) <(cmd b) में विस्तारित किया गया था और पास किया गया था शामिल/आदि में वे स्क्रिप्ट बड़े पैमाने पर इस सुविधा का उपयोग कर रहे हैं, इसे कई स्तरों पर घोंसले हुए हैं और स्क्रिप्ट का परीक्षण किया जाता है (यह मेरी वसा उंगलियों से छूना नहीं चाहता था और नई त्रुटियां उत्पन्न करना चाहता था)। – Vlad
@Vlad यह एक बग जैसा लगता है, जिसे उन्होंने 4 बश में तय किया है। आपको '<(...)' के अंदर कमांड को किसी अन्य कमांड के समान पार्स करने की अपेक्षा करनी चाहिए, इसलिए <<(cmd {a, b}) '' (cmd ab) 'के बराबर होना चाहिए। – Barmar