कमांड प्रतिस्थापन के लिए दो वाक्यविन्यास हैं: डॉलर-कोष्ठक के साथ और बैकटिक्स के साथ। रनिंग top -p $(pidof init)
और top -p `pidof init`
एक ही आउटपुट देता है। क्या एक ही काम करने के ये दो तरीके हैं, या मतभेद हैं?
कमांड प्रतिस्थापन के लिए दो वाक्यविन्यास हैं: डॉलर-कोष्ठक के साथ और बैकटिक्स के साथ। रनिंग top -p $(pidof init)
और top -p `pidof init`
एक ही आउटपुट देता है। क्या एक ही काम करने के ये दो तरीके हैं, या मतभेद हैं?
जवाबों:
पुरानी शैली के बैकक्वाट्स ` `
बैकस्लैश का इलाज करते हैं और थोड़ा अलग करते हैं। नई शैली एक कमांड के रूप $()
में बीच में सब कुछ की व्याख्या करती है ( )
।
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`
'`'`''`''`'`''`'
(और एसई ` `
अपने उद्देश्य के लिए उपयोग करता है , यह इस उत्तर को लिखने में एक दर्द था :)
{ }
आमतौर पर "घुंघराले कोष्ठक" या "ब्रेसिज़" को en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
पर एक मृत कुंजी है, इसलिए मुझे या तो एक डबल-बैकटिक टाइप करना है (कुछ ऐसा जिसे मैं आमतौर पर भूल सकता हूं कि मैं भी कर सकता हूं) या बैकटिक फिर स्पेस, जो कि एक है दर्द।
स्पष्ट अंतर मैं देख रहा हूँ कि जब आप घोंसला बना सकते हैं तो आप बैकस्ट को घोंसला नहीं बना सकते $()
। हो सकता है कि दोनों विरासत कारणों से मौजूद हों। इसी तरह, .
और source
कमांड पर्यायवाची हैं।
source
। डैश एक उदाहरण है।
$(...)
और `...`
मानक हैं (उत्तरार्द्ध बहिष्कृत किया जा रहा), जबकि .
मानक है, लेकिन नहींsource
(t)csh
वे में निहित नहीं किया जा सकता है। हालांकि (t)csh
समर्थन नहीं करते $(...)
। हालांकि वे समर्थन source
(और नहीं .
) करते हैं।
$()
पुराने बॉर्न शेल के साथ काम नहीं करता है। लेकिन यह किया गया है साल दशक के बाद से मैं पुराने बॉर्न शैल के साथ काम किया।
एक और नोट, $()
बैकटिक्स का उपयोग करने की तुलना में अधिक सिस्टम संसाधन का उपयोग करेगा, लेकिन थोड़ा तेज है।
में मास्टरिंग यूनिक्स शेल पटकथा लेखन , रैंडल लालकृष्ण माइकल "24 तरीके एक फ़ाइल लाइन-लाइन द्वारा संसाधित करने" नामक एक अध्याय में एक परीक्षण किया था।
$()
आपकी स्क्रिप्ट को एक बाइट से बड़ा बनाता है यदि यह प्रयोग किया जाता है `
(यह मानते हुए कि आप उन्हें घोंसला नहीं बनाते हैं और बैकस्लैश का उपयोग नहीं करते हैं)। जैसा कि पार्स करने के लिए तेज़ होगा, जो कि गोले के बीच अलग-अलग होगा और पाइप बनाने की प्रक्रिया की लागत की तुलना में नगण्य के रूप में अप्रासंगिक होगा और प्रक्रिया का फोर्क जो कमांड प्रतिस्थापन की आवश्यकता है।
यहाँ दूसरों ने जो कहा है, उसे जोड़ने के लिए, आप इनलाइन टिप्पणियों का अनुकरण करने के लिए बैकटिक्स का उपयोग कर सकते हैं:
echo foo `# I'm a comment!` bar
उत्पादन होता है: foo bar
।
अधिक जानकारी के लिए निम्नलिखित देखें: https://stackoverflow.com/a/12797512 (उस पोस्ट के नीचे टिप्पणी भी नोट करें ।)
$()
वाक्य रचना वर्ष बॉर्न शैल के साथ काम नहीं करेगा।
नए गोले के साथ ` `
और $()
समतुल्य होते हैं, लेकिन $()
जब आप कई कमांडों को घोंसले में करने की आवश्यकता होती है, तो इसका उपयोग करना अधिक सुविधाजनक होता है।
उदाहरण के लिए :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
टाइप करना और डीबग करना आसान है:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``