कोष्ठक में कोष्ठक $ () और घुंघराले ब्रैकेट $ {} वाक्य रचना के बीच क्या अंतर है?


110

वाक्यविन्यास के साथ चर को लागू करने में कोई अंतर है ${var}और $(var)? उदाहरण के लिए, चर को किस तरह से विस्तारित किया जाएगा या कुछ भी?

जवाबों:


95

कोई अंतर नहीं है - उनका मतलब बिल्कुल वही है (जीएनयू मेक और पोसिक्स मेक में)।

मुझे लगता है कि $(round brackets)टिडियर दिखते हैं, लेकिन यह सिर्फ व्यक्तिगत पसंद है।

(अन्य उत्तर GNU मेक डॉक्युमेंट के संबंधित अनुभागों की ओर इशारा करते हैं, और ध्यान दें कि आपको सिंटैक्स को एक ही एक्सप्रेशन में नहीं मिलाना चाहिए)


11
मैं $()मेक और शेल वैरिएबल के बीच खुद को भ्रम (पहले से मौजूद है) से बचने के लिए मेक इन का उपयोग करता हूं। GNU वेरिएबल रेफरेंस पर डॉक्यूमेंटेशन करें
इटन रिस्नर

इस उत्तर के विस्तार का सुझाव देने के लिए उपयोगकर्ता @Eloy के लिए धन्यवाद, भले ही मैंने अन्य उत्तरों में मूल्यवान अतिरिक्त बिंदुओं को नोट करने के पक्ष में उनके संकलन को अस्वीकार कर दिया हो।
नॉर्मन ग्रे

1
कुछ उपकरण उनकी समानता का सम्मान नहीं कर सकते हैं। IntelliJ IDEA ने deploy: ${DEPS}मेरे लिए एक सिंटैक्स त्रुटि के रूप में हाइलाइट किया, लेकिन deploy: $(DEPS)सही होने के बावजूद दोनों स्पेलिंग का प्रभाव समान रूप से दिखाया गया है make
अंचल

45

प्रलेखन राज्य से भिन्न संदर्भ अनुभाग की मूल बातें कोई मतभेद नहीं हैं :GNU make

एक वेरिएबल का मान स्थानापन्न करने के लिए, डॉलर चिन्ह कोष्ठक या ब्रेसिज़ में चर का नाम और उसके बाद लिखें: या तो $(foo)या ${foo}एक मान्य संदर्भ है चर foo के लिए।


13

जैसा कि पहले ही सही ढंग से कहा गया है, इसमें कोई अंतर नहीं है लेकिन दो प्रकार के सीमांकक को मिश्रण नहीं करने के लिए सावधान रहना चाहिए क्योंकि यह अनियंत्रित जीएनयू जैसे क्रिप्टोकरेंसी त्रुटियों का कारण बन सकता है ।

GNU से फंक्शन कॉल सिंटैक्स पर मैनुअल करें (जोर मेरा):

[…] यदि तर्कों में स्वयं अन्य फ़ंक्शन कॉल या चर संदर्भ होते हैं, तो सभी संदर्भों के लिए एक ही तरह के सीमांकक का उपयोग करना बुद्धिमानी है; लिखो $(subst a,b,$(x)), नहीं $(subst a,b,${x})। ऐसा इसलिए है क्योंकि यह स्पष्ट है, और क्योंकि संदर्भ के अंत का पता लगाने के लिए केवल एक प्रकार के सीमांकक का मिलान किया जाता है


11

वास्तव में, यह काफी अलग प्रतीत होता है:

, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)

आउटपुट

a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.

लेकिन अभी तक मुझे केवल यही अंतर मिला था जब चर नाम $ {...} में स्वयं एक अल्पविराम था। मैंने पहले सोचा था कि $ {...} मूल्य के रूप में अल्पविराम का विस्तार नहीं कर रहा था, लेकिन यह इस तरह से मुझे हैक करने में सक्षम नहीं है। मुझे अभी भी यह समझ में नहीं आया है ... अगर किसी के पास स्पष्टीकरण था, तो मुझे यह जानकर खुशी होगी!


एडोर्ड के जवाब के आधार पर, जो नोट करता है कि GNU प्रलेखन राज्यों में कोई अंतर नहीं है, मुझे लगता है कि यह सिर्फ एक बग हो सकता है।
कीथ एम

7
जैसा कि अलेक्जेंड्रे पेरिन के जवाब में कहा गया है, दो वाक्यविन्यासों को एक ही पंक्ति में नहीं मिलाया जाना चाहिए।
लेन्ज

11

$ {} शैली आपको शेल में मेक रूल्स का परीक्षण करने देती है, यदि आपके पास इसके अनुरूप वैरिएबल सेट हैं, क्योंकि यह बैश के अनुकूल है।


3

अगर अभिव्यक्ति में असंतुलित कोष्ठक होते हैं तो इससे फर्क पड़ता है:

${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))

->

:-(
*** insufficient number of arguments (1) to function 'subst'.  Stop.

चर संदर्भों के लिए, यह फ़ंक्शंस के लिए, या चर नामों के लिए एक अंतर बनाता है जिसमें कोष्ठक (बुरा विचार) होता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.