2017-03-16 10 views
6

विरासत प्रणाली में से एक को 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) वाक्य रचना टाइपिंग पर एक टन बचाने के लिए अनुमति दी मैं हैरान हूँ ...

+3

ओह, प्रतीक्षा करें। आप दो अलग-अलग * प्रक्रिया प्रतिस्थापन * उत्पन्न होने की उम्मीद करते हैं, न कि 'sed' के लिए दो तर्क? मुझे नहीं पता कि यह ** ** ** सही, दस्तावेज व्यवहार के अनुरूप था ... जो कहने के लिए है, AFAIK, आपका कोड एक बग पर निर्भर था। –

+0

@ चार्ल्सडफी - इस तरह यह हमेशा काम करता है (मेरे लिए और स्क्रिप्ट्स) bash4 अपग्रेड तक - '<(cmd {a, b}) 'को दो' <(cmd a) <(cmd b) में विस्तारित किया गया था और पास किया गया था शामिल/आदि में वे स्क्रिप्ट बड़े पैमाने पर इस सुविधा का उपयोग कर रहे हैं, इसे कई स्तरों पर घोंसले हुए हैं और स्क्रिप्ट का परीक्षण किया जाता है (यह मेरी वसा उंगलियों से छूना नहीं चाहता था और नई त्रुटियां उत्पन्न करना चाहता था)। – Vlad

+3

@Vlad यह एक बग जैसा लगता है, जिसे उन्होंने 4 बश में तय किया है। आपको '<(...)' के अंदर कमांड को किसी अन्य कमांड के समान पार्स करने की अपेक्षा करनी चाहिए, इसलिए <<(cmd {a, b}) '' (cmd ab) 'के बराबर होना चाहिए। – Barmar

उत्तर

4

मूल व्यवहार था अनियंत्रित (और सामान्य नियम के विपरीत कि एक प्रक्रिया प्रतिस्थापन में संलग्न कोड, जैसे कि सबहेल या इसी तरह के संदर्भ, उसी तरह से पारदर्शी तरीके से जिसमें यह समान व्यवहार होता)।

इस तरह, यह एक बग था, सुविधा नहीं। यह बग बैश-4.0-अल्फा में तय किया गया था। चेंज प्रविष्टि का उद्धरण:

आरआर। ब्रेस विस्तार अब प्रक्रिया प्रतिस्थापन अपरिवर्तित के माध्यम से पारित करने की अनुमति देता है।

इस परिवर्तन को वापस करने के लिए कोई रनटाइम झंडे उपलब्ध नहीं हैं।

+1

इस बीच एक ही दिशा में खुदाई कर रहा था, एक और प्रभावित उपयोगकर्ता (http://wiki.bash-hackers.org/syntax/expansion/brace) मिला, फिर चेंज में एक ही प्रविष्टि मिली और सभी गिट काम करता है जो "बैश -20080724 स्नैपशॉट प्रतिबद्ध करें"। मेरे लक्ष्य की सादगी के लिए - मैं केवल प्राथमिकता-परिवर्तन को वापस करने के दौरान अपने बॉक्स के लिए कस्टम bash4 को पुन: संकलित करूंगा, फिर स्क्रिप्ट को फिर से जांचूंगा। दुख की बात है कि यह मेरे लक्ष्य को सरल बनाने के लिए रनटाइम झंडे से अवगत नहीं था। मुझे सभी उत्तरों को ऊपर उठाने दें और धन्यवाद! – Vlad

संबंधित मुद्दे