2011-01-16 11 views
178

श/ksh/बैश में एक आदेश के उत्पादन में एक चर के रूप में आप या तो

MY_VAR=$(command) 
#or you can do 
MY_VAR=`command` 

क्या फर्क है क्या कर सकते हैं स्टोर करने के लिए दो तरीकों के बीच यदि कोई हो?

+21

कृपया देखें [BashFAQ/082] (http://mywiki.wooledge.org/BashFAQ/082)। –

+0

आपको गिट कोडिंग दिशानिर्देश में विस्तृत नेस्टेड समस्या मिलेगी: देखें [नीचे मेरा जवाब] (http://stackoverflow.com/a/24592916/6309)। – VonC

उत्तर

199

कमांड प्रतिस्थापन के लिए $() के पक्ष में बैकटिक्स/कब्रिस्तान को हटा दिया गया है क्योंकि $()$(echo foo$(echo bar)) में आसानी से घोंसला कर सकता है। बैकटिक/कब्रमार्क संस्करण आदि में बैकस्लाश को कैसे पार्स किया गया है, जैसे अन्य अंतर भी हैं।

BashFAQ/082 को हमेशा $ (...) वाक्यविन्यास पसंद करने के कई कारणों से देखें।

विभिन्न अंतरों पर विस्तृत जानकारी के लिए POSIX spec भी देखें।

+20

अच्छा लिंक, लेकिन वह टेक्स्ट '$ (...)' के पक्ष में _deprecate_ बैकक्वॉट नहीं करता है - यह केवल उन्हें विकल्प के रूप में नोट करता है। –

+19

@NormanGray POSIX शब्द * बहिष्कृत * नहीं कह सकता है, लेकिन यह कहता है कि "कमांड प्रतिस्थापन की बैकक्वॉटेड किस्म की अनुशंसा नहीं की जाती है" जो कि आईएमएचओ – SiegeX

+7

बहिष्कृत कहने का एक लंबा घुमावदार तरीका है, पॉज़िक्स ने बैकिक्स को नहीं छोड़ा, बल्कि इसके बजाय जोड़ा एक वैकल्पिक विधि के रूप में '$ (...)'। बैकटिक्स के साथ कोई ज्ञात कार्यान्वयन बग नहीं है, लेकिन '$ (...)' के साथ कई ज्ञात कार्यान्वयन बग हैं। तो पोर्टेबिलिटी मुद्दों के लिए गैर-नेस्टेड कॉल के लिए बैकटीक्स का उपयोग करने की अनुशंसा की जाती है। '$ (...) 'को एक पुनरावर्ती पार्सर की आवश्यकता है लेकिन इसका उपयोग ksh86 के साथ नहीं किया गया था जिसने सुविधा पेश की थी। सही कार्यान्वयन की सूची के लिए http://www.in-ulm.de/~mascheck/various/cmd-subst/ देखें। एक अनुरूप शेल को डी 2 को छोड़कर सभी मामलों का समर्थन करने की आवश्यकता है। – schily

5

कम अंतर है, इसके अलावा आप अनचाहे वर्णों को छोड़कर कमांड के अंदर उपयोग कर सकते हैं। आप `...$ (...) (और इसके विपरीत) एक जटिल दो-स्तर-गहरे कमांड प्रतिस्थापन के लिए भी डाल सकते हैं।

बैकस्लैश चरित्र/ऑपरेटर की थोड़ी अलग व्याख्या है। अन्य बातों के, जब `` ... प्रतिस्थापन आदेशों घोंसले के अलावा, आप के साथ \, साथ जबकि $() substition यह स्वचालित रूप से घोंसला बनाने से समझता है भीतरी ` वर्ण से बचें चाहिए।

22

जब पुराने बैक-टिक फॉर्म का उपयोग किया जाता है, बैकस्लैश अपने शाब्दिक अर्थ को बरकरार रखता है, इसके बाद $, `, या \। बैकस्लैश से पहले की पहली बैक-टिक कमांड प्रतिस्थापन को समाप्त नहीं करती है।

नए $(command) फ़ॉर्म का उपयोग करते समय, कोष्ठक के बीच के सभी वर्ण कमांड बनाते हैं; किसी विशेष रूप से इलाज नहीं किया जाता है।

दोनों रूपों को घोंसला जा सकता है, लेकिन बैक-टिक विविधता को निम्नलिखित रूप की आवश्यकता होती है।

`echo \`foo\`` 

के रूप में करने का विरोध किया:

$(echo $(foo)) 
+1

मामूली सुधार, बैकटिक संस्करण और '$()' संस्करण दोनों पॉज़िक्स अनुपालन हैं। – SiegeX

+0

नोट किया गया, और अपडेट किया गया, धन्यवाद। – ocodo

32

वे एक ही व्यवहार करते हैं। अंतर वाक्य है:

listing=$(ls -l $(cat filenames.txt)) 

बनाम

listing=`ls -l \`cat filenames.txt\`` 
+7

'echo $ (echo \ $ abc)' 'echo' echo \ $ abc''' जैसा नहीं है - '' $ (echo \ ')' '' '' $ (echo \ \) ' –

22

जुलाई 2014:: commit f25f5e6 (Elia Pinto (devzero2000) द्वारा अप्रैल 2014, Git 2.0) नेस्टिंग मुद्दे पर कहते हैं यह `` से घोंसला $() करना आसान है:

बैकक्वॉक्टेड फॉर्म कमांड प्रतिस्थापन के लिए पारंपरिक विधि है, और POSIX द्वारा समर्थित है।
हालांकि, सबसे सरल उपयोग सभी जटिल हो जाते हैं।
विशेष रूप से, एम्बेडेड कमांड प्रतिस्थापन और/या डबल कोट्स के उपयोग की आवश्यकता बैकस्लैश वर्ण
से सावधान रहना आवश्यक है।

है क्यों git/Documentation/CodingGuidelines कहा गया है कि:

हम आदेश प्रतिस्थापन के लिए $(...) पसंद करते हैं; `` के विपरीत, यह ठीक से घोंसला करता है।
बोर्न ने इसे पहले दिन से लिखा था, लेकिन दुर्भाग्य से ऐसा नहीं होना चाहिए था।

thitoncommented:

है यही कारण है कि `echo `foo`` निहित अस्पष्टता की वजह से सामान्य रूप में काम नहीं करेगा क्योंकि प्रत्येक `` या खोलने जा सकती है समापन।
यह भाग्य या विशेष सुविधाओं के कारण विशेष मामलों के लिए काम कर सकता है।


अपडेट जनवरी 2016: Git 2.8 (मार्च 2016) बैकटिक को पूर्णत: नष्ट हो जाता है।

commit ec1b763, commit 9c10377, commit c7b793a, commit 80a6b3f, commit 9375dcf, commit e74ef60, commit 27fe43e, commit 2525c51, commit becd67f, commit a5c98ac, commit 8c311f9, commit 57da049, commit 1d9e86f, commit 78ba28d, commit efa639f, commit 1be2fa0, commit 38e9476, commit 8823d2f, commit 32858a0, commit cd914d8 (12 जनवरी 2016) द्वारा देखें Elia Pinto (devzero2000)
(commit e572fef में Junio C Hamano -- gitster -- द्वारा विलय, 22 जनवरी 2016)

Git 2.8 के बाद से, यह सब $(...), कोई और अधिक `...` है।

+1

@VonC स्वयं को नोट करें: यह मेरा 150 वां Necromancer बैज है। – VonC

+0

'$()' POSIX- निर्दिष्ट भी है - एक उद्धरण जो बैकटिक्स को "POSIX- समर्थित" के रूप में वर्णित करता है, यह दर्शाता है कि यह उनके लिए अद्वितीय है भ्रामक है। यह केवल (1 9 70-युग) प्री-पॉसिक्स बोर्न है जहां बैकटीक्स एकमात्र समर्थित वाक्यविन्यास हैं। –

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