$ (सामान) और `सामान 'के बीच अंतर क्या है?


265

कमांड प्रतिस्थापन के लिए दो वाक्यविन्यास हैं: डॉलर-कोष्ठक के साथ और बैकटिक्स के साथ। रनिंग top -p $(pidof init)और top -p `pidof init`एक ही आउटपुट देता है। क्या एक ही काम करने के ये दो तरीके हैं, या मतभेद हैं?


18
यह भी देखें: BashFAQ / 082
डेनिस विलियमसन

42
वहाँ एक दूसरे के लिए मैंने सोचा कि यह एक jQuery सवाल था।
डेविड मर्डोक

परिणाम शेल पर निर्भर हो सकता है - कुछ समर्थन दोनों।
artdanil

जवाबों:


359

पुरानी शैली के बैकक्वाट्स ` `बैकस्लैश का इलाज करते हैं और थोड़ा अलग करते हैं। नई शैली एक कमांड के रूप $()में बीच में सब कुछ की व्याख्या करती है ( )

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

यदि नेस्टेड बैककोट बच जाते हैं तो काम करता है:

echo `uname | \`echo cat\``
Linux

बैकस्लैश मज़ा:

echo $(echo '\\')
\\

echo `echo '\\'`
\

नई शैली $()सभी POSIX -conformant गोले पर लागू होती है ।
जैसा कि माउवीसील ने बताया, पुरानी शैली ` `पुराने गोले के लिए आवश्यक हो सकती है।

तकनीकी दृष्टिकोण के अलावा, पुरानी शैली ` `में एक दृश्य नुकसान भी है:

  • नोटिस करना मुश्किल: I like $(program) better than `program`
  • एक ही उद्धरण के साथ आसानी से भ्रमित: '`'`''`''`'`''`'
  • टाइप करना इतना आसान नहीं (हो सकता है कि कीबोर्ड के मानक लेआउट पर भी नहीं)

(और एसई ` `अपने उद्देश्य के लिए उपयोग करता है , यह इस उत्तर को लिखने में एक दर्द था :)


10
केवल एक चीज मैं जोड़ना होगा, कि मैं फोन '(' एक कोष्ठक, नहीं एक ब्रैकेट (जो '[' है)।
केंडल Helmstetter Gelner

@ केंडल: और यहां मैंने सोचा कि '{' उन सभी वर्षों के लिए बाएं कोष्ठक था ...
सैमबी

5
@ सॅम: { }आमतौर पर "घुंघराले कोष्ठक" या "ब्रेसिज़" को en.wikipedia.org/wiki/Braces_(punctuation)#Braces
जोर्न शॉ-रोड

2
मैं कर्ली ब्रेसेस के रूप में '{' का भी उल्लेख करता हूं। हालांकि यह अजीब लगता है कि आपको क्वालीफायर "घुंघराले" को जोड़ने की आवश्यकता है यदि आप अन्य चीजों को ब्रैकेट कहते हैं ... मुझे लगता है कि यह सिर्फ इसलिए है क्योंकि वे वास्तव में आरएल हैं।
केंडल हेल्मसटेटर जेलर

1
@slim मुझे यूएस / यूके कीबोर्ड पर नहीं पता है, लेकिन स्पेनिश कीबोर्ड `पर एक मृत कुंजी है, इसलिए मुझे या तो एक डबल-बैकटिक टाइप करना है (कुछ ऐसा जिसे मैं आमतौर पर भूल सकता हूं कि मैं भी कर सकता हूं) या बैकटिक फिर स्पेस, जो कि एक है दर्द।
डार्कहॉग

41

स्पष्ट अंतर मैं देख रहा हूँ कि जब आप घोंसला बना सकते हैं तो आप बैकस्ट को घोंसला नहीं बना सकते $()। हो सकता है कि दोनों विरासत कारणों से मौजूद हों। इसी तरह, .और sourceकमांड पर्यायवाची हैं।


10
कुछ बॉर्न-व्युत्पन्न गोले पहचान नहीं करते हैं source। डैश एक उदाहरण है।
डेनिस विलियम्सन

14
यह सच नहीं है। आप किसी भी स्तर पर बैकटिक को घोंसला कर सकते हैं, बस अधिक दर्दनाक रूप से। नोट दोनों कि $(...)और `...`मानक हैं (उत्तरार्द्ध बहिष्कृत किया जा रहा), जबकि .मानक है, लेकिन नहींsource
स्टीफन Chazelas

3
सुधार, केवल (t)cshवे में निहित नहीं किया जा सकता है। हालांकि (t)cshसमर्थन नहीं करते $(...)। हालांकि वे समर्थन source(और नहीं .) करते हैं।
स्टीफन चेज़लस

28

$()पुराने बॉर्न शेल के साथ काम नहीं करता है। लेकिन यह किया गया है साल दशक के बाद से मैं पुराने बॉर्न शैल के साथ काम किया।


1970 और 1980 की शुरुआत की तरह सही है?
क्रिस्टोफर

6

एक और नोट, $()बैकटिक्स का उपयोग करने की तुलना में अधिक सिस्टम संसाधन का उपयोग करेगा, लेकिन थोड़ा तेज है।

में मास्टरिंग यूनिक्स शेल पटकथा लेखन , रैंडल लालकृष्ण माइकल "24 तरीके एक फ़ाइल लाइन-लाइन द्वारा संसाधित करने" नामक एक अध्याय में एक परीक्षण किया था।


2
यह दावा बकवास है। ऐसा कोई कारण नहीं है कि यह तेज होना चाहिए क्योंकि यह सिर्फ पार्सर के लिए एक अलग संकेतन का उपयोग कर रहा है।
विद्वान

@ शिल्पी: हो सकता है, मैं केवल पुस्तक से उद्धृत करता हूं, आप इसे अधिक विवरण के लिए पढ़ सकते हैं।
cuonglm

3
मैं @schily से सहमत होना चाहूंगा ... यह अधिक संसाधन क्यों लेगा?
वाइल्डकार्ड

2
@Wildcard, मुझे लगता है कि यह $()आपकी स्क्रिप्ट को एक बाइट से बड़ा बनाता है यदि यह प्रयोग किया जाता है `(यह मानते हुए कि आप उन्हें घोंसला नहीं बनाते हैं और बैकस्लैश का उपयोग नहीं करते हैं)। जैसा कि पार्स करने के लिए तेज़ होगा, जो कि गोले के बीच अलग-अलग होगा और पाइप बनाने की प्रक्रिया की लागत की तुलना में नगण्य के रूप में अप्रासंगिक होगा और प्रक्रिया का फोर्क जो कमांड प्रतिस्थापन की आवश्यकता है।
स्टीफन चेज़लस

5

यहाँ दूसरों ने जो कहा है, उसे जोड़ने के लिए, आप इनलाइन टिप्पणियों का अनुकरण करने के लिए बैकटिक्स का उपयोग कर सकते हैं:

echo foo `# I'm a comment!` bar

उत्पादन होता है: foo bar

अधिक जानकारी के लिए निम्नलिखित देखें: https://stackoverflow.com/a/12797512 (उस पोस्ट के नीचे टिप्पणी भी नोट करें ।)


1

$()वाक्य रचना वर्ष बॉर्न शैल के साथ काम नहीं करेगा।
नए गोले के साथ ` `और $()समतुल्य होते हैं, लेकिन $()जब आप कई कमांडों को घोंसले में करने की आवश्यकता होती है, तो इसका उपयोग करना अधिक सुविधाजनक होता है।

उदाहरण के लिए :

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

टाइप करना और डीबग करना आसान है:

echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``

1
जबकि $ () अच्छा लग सकता है, संबंधित पार्सर को लागू करते समय यह दर्द होता है क्योंकि इसके लिए दोहरी पुनरावर्ती पार्सर की आवश्यकता होती है।
विद्वान

6
@ दूसरी तरफ, एक अच्छे पार्सर के बिना एक शेल क्या होगा।
इमैनुएल 15

1
समस्या यह है कि आपको यह जानने की जरूरत है कि पार्सर को कॉल करने से पहले स्ट्रिंग कहाँ समाप्त होती है। यह बैकटिक्स के साथ अपेक्षाकृत सरल है, लेकिन यह कोष्ठक के साथ कठिन है क्योंकि वे शेल में विभिन्न प्रयोजनों के लिए उपयोग किए जाते हैं। तो आपको दो बार पार्सर की आवश्यकता है और एक तरह से जो बॉर्न शेल में मौजूद नहीं है।
शिल्पी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.