2012-02-23 30 views
134

बैश में कमांड प्रतिस्थापन करने का पसंदीदा तरीका क्या है?कमांड प्रतिस्थापन: बैकटिक्स या डॉलर का चिह्न/अभिभावक संलग्न है?

मैं हमेशा इस तरह यह किया है:

echo "Hello, `whoami`." 

लेकिन हाल ही में, मैं अक्सर देखा इसे इस तरह लिखा है:

echo "Hello, $(whoami)." 

पसंदीदा वाक्य रचना क्या है, और क्यों? या वे बहुत अधिक विनिमय योग्य हैं?

मैं पहले पक्ष का पक्ष लेता हूं, क्योंकि मेरे टेक्स्ट एडिटर को यह पता चलता है कि यह क्या है, और सिंटैक्स उचित रूप से हाइलाइट करता है।

मैंने here पढ़ा है कि प्रत्येक मामले में वर्ण बचने वाले चरित्र अलग-अलग कार्य करते हैं, लेकिन यह मुझे स्पष्ट नहीं है कि कौन सा व्यवहार बेहतर है, या अगर यह स्थिति पर निर्भर करता है।

साइड प्रश्न: क्या दोनों स्क्रिप्ट में रूपों का उपयोग करना बुरा अभ्यास है, उदाहरण के लिए जब कमांड प्रतिस्थापन घोंसला करते हैं?

+1

एक पक्ष नोट के रूप में: उदाहरण के काम नहीं करता है :) आप का उपयोग करना चाहिए: गूंज "हैलो, $ (Whoami)" '!' (विस्मयादिबोधक चिह्न के उपयोग के कारण) – rmuller

+0

@rmuller, उदाहरण के परीक्षणों के लिए मुझे यही मिलता है। इसे एक अवधि में बदल दिया। :) –

उत्तर

136

वहाँ कई सवाल/मुद्दों यहाँ हैं, इसलिए मैं पोस्टर के पाठ के प्रत्येक अनुभाग दोहराने की आवश्यकता होगी , ब्लॉक-उद्धृत, और मेरी प्रतिक्रिया के बाद।

पसंदीदा वाक्यविन्यास क्या है, और क्यों? या वे बहुत अधिक विनिमय योग्य हैं?

मैं कहूंगा कि $(some_command) फ़ॉर्म `some_command` फ़ॉर्म पर पसंदीदा है। बैकक्वॉट्स ("` "चरित्र, जिसे बैकटिक और कब्र उच्चारण भी कहा जाता है) का दूसरा रूप, इसे करने का ऐतिहासिक तरीका है। डॉलर का चिह्न और कोष्ठक का उपयोग करने वाला पहला रूप, एक नया पॉज़िक्स रूप है, जिसका अर्थ यह है कि यह संभवतः इसे करने का एक और मानक तरीका है। बदले में, मुझे लगता है कि इसका मतलब है कि अलग-अलग गोले और विभिन्न * निक्स कार्यान्वयन के साथ सही तरीके से काम करने की संभावना है।

पहला (पीओएसआईक्स) फॉर्म पसंद करने के लिए दिया गया एक अन्य कारण यह है कि इसे पढ़ना आसान है, खासकर जब कमांड प्रतिस्थापन घोंसला जाता है। इसके अलावा, बैकटिक फॉर्म के साथ, बैकटिक पात्रों को नेस्टेड (आंतरिक) कमांड प्रतिस्थापन में बैकस्लैश-बच निकलना पड़ता है।

पॉज़िक्स फॉर्म के साथ, आपको ऐसा करने की आवश्यकता नहीं है।

जहां तक ​​वे विचलित होते हैं, ठीक है, मैं कहूंगा कि सामान्य रूप से, वे अलग-अलग वर्णों के लिए उल्लिखित अपवादों के अलावा, एक दूसरे के बदले में बदल सकते हैं। हालांकि, मुझे नहीं पता और यह नहीं कह सकता कि सभी आधुनिक शैल और सभी आधुनिक * निक्स दोनों रूपों का समर्थन करते हैं या नहीं। मुझे संदेह है कि वे करते हैं, खासकर पुराने गोले/पुराने * निक्स। अगर मैं आप थे, तो मैं बिना किसी खोल/* निक्स कार्यान्वयन पर प्रत्येक फॉर्म के कुछ त्वरित, सरल परीक्षणों को चलाने के बिना इंटरचेंजबिलिटी पर निर्भर नहीं रहूंगा, जिसे आप अपनी तैयार स्क्रिप्ट चलाने की योजना बना रहे हैं।

मैं पहले का पक्ष लेता हूं, क्योंकि मेरे टेक्स्ट एडिटर को यह पता चलता है कि यह क्या है, और सिंटैक्स उचित रूप से हाइलाइट करता है।

यह दुर्भाग्यपूर्ण है कि आपका संपादक POSIX फ़ॉर्म का समर्थन नहीं करता है; हो सकता है कि आपको यह देखने के लिए जांच करनी चाहिए कि आपके संपादक में कोई अपडेट है या नहीं, जो इसे करने के POSIX तरीके का समर्थन करता है। शायद लंबे शॉट, लेकिन कौन जानता है? या, शायद आपको एक अलग संपादक की कोशिश करने पर भी विचार करना चाहिए।

जीजीजी, आप किस पाठ संपादक का उपयोग कर रहे हैं ???

मैंने यहां पढ़ा है कि प्रत्येक मामले में बच निकले चरित्र अलग-अलग कार्य करते हैं, लेकिन यह मुझे स्पष्ट नहीं है कि कौन सा व्यवहार बेहतर है, या अगर यह स्थिति पर निर्भर करता है।

मैं कहूंगा कि यह उस पर निर्भर करता है जो आप पूरा करने की कोशिश कर रहे हैं; दूसरे शब्दों में, चाहे आप कमांड प्रतिस्थापन के साथ बच निकले वर्णों का उपयोग कर रहे हों या नहीं।

साइड प्रश्न: क्या एक स्क्रिप्ट में दोनों रूपों का उपयोग करना बुरा अभ्यास है, उदाहरण के लिए जब कमांड प्रतिस्थापन घोंसला करते हैं?

अच्छा, यह स्क्रिप्ट को पढ़ने के लिए थोड़ा आसान बना सकता है (टाइपोग्राफ़िक रूप से बोल रहा है), लेकिन समझना मुश्किल है! कोई आपकी स्क्रिप्ट पढ़ रहा है (या आप इसे छह महीने बाद पढ़ रहे हैं!) शायद आश्चर्य होगा कि आपने एक फॉर्म या दूसरे के साथ क्यों नहीं चिपकाया - जब तक आप टिप्पणियों में ऐसा क्यों नहीं करते हैं, इस बारे में कुछ प्रकार का नोट नहीं देते। इसके अलावा, एक स्क्रिप्ट में दोनों रूपों को मिलाकर उस स्क्रिप्ट को पोर्टेबल होने की संभावना कम हो जाएगी: स्क्रिप्ट को ठीक तरह से काम करने के लिए, इसे खोलने वाले खोल को दोनों रूपों का समर्थन करना होगा, न केवल एक रूप या दूसरा।

शैल स्क्रिप्ट को समझने योग्य बनाने के लिए, मैं व्यक्तिगत रूप से किसी भी एक स्क्रिप्ट में चिपकना पसंद करता हूं, जब तक अन्यथा ऐसा करने का कोई अच्छा तकनीकी कारण न हो। इसके अलावा, मैं पुराने रूप में POSIX रूप पसंद करूंगा; फिर भी, जब तक अन्यथा करने के लिए कोई अच्छा तकनीकी कारण न हो।

कमांड प्रतिस्थापन के विषय पर और इसे करने के लिए दो अलग-अलग रूपों के लिए, मेरा सुझाव है कि आप रॉबिन द्वारा ओ'रेली पुस्तक "क्लासिक शैल स्क्रिप्टिंग", दूसरे संस्करण में कमांड प्रतिस्थापन पर अनुभाग देखें। बीबे। उस खंड में, लेखकों का कहना है कि कमांड प्रतिस्थापन के लिए POSIX फॉर्म "सभी नए विकास के लिए अनुशंसित है।" मेरे पास इस पुस्तक में कोई वित्तीय रुचि नहीं है; शेल स्क्रिप्टिंग पर यह सिर्फ एक है (और प्यार), हालांकि यह मध्यवर्ती या उन्नत शैल स्क्रिप्टिंग के लिए अधिक है, और वास्तव में शेल स्क्रिप्टिंग शुरू करने के लिए नहीं है।

-बी।

+5

वाह ... मुझे इस जवाब की पूर्णता से उड़ा दिया गया है। मैं आम तौर पर दिन-प्रति-दिन चीजों के लिए जीएडिट का उपयोग करता हूं; यह बैकक्वॉट्स के बीच सामान बोल्ड करता है। –

+5

कुल मिलाकर अच्छा जवाब - कोष्ठक निश्चित रूप से पसंदीदा हैं। लेकिन ध्यान रखें कि बैकटिक्स * POSIX मानक का हिस्सा है। जिस तरह से उत्तर गलत तरीके से स्वरूपित किया गया है, इसका तात्पर्य है कि यह नहीं है। – zaTricky

+0

मैं कथन के स्रोत के बारे में उत्सुक था "डॉलर का चिह्न और ब्रांड्स का उपयोग करके पहला फॉर्म, एक नया पॉज़िक्स रूप है", इसलिए यहां [इसके बारे में पॉसिक्स स्पेक] है (http://pubs.opengroup.org/onlinepubs /9699919799/utilities/V3_chap02.html#tag_18_06_03)। –

39

आप bash manual से अंतर पढ़ सकते हैं। ज्यादातर मामलों में, वे विस्थापन योग्य हैं।


एक बात का उल्लेख है कि आप backquote बच चाहिए घोंसला के लिए आदेश है:

$ echo $(echo hello $(echo word)) 
hello word  

$ echo `echo hello \`echo word\`` 
hello word 

+11

जब आपके पास बैकटिक्स के साथ घोंसले का तीसरा स्तर होता है तो यह वास्तव में * बदसूरत हो जाता है। बस '()' अधिक घोंसले के लिए $() 'प्रपत्र –

+4

इस कारण मैं अक्सर प्रथम स्तर के लिए बैकटिक का उपयोग करें और' $ के लिए के साथ चिपके रहते हैं। – Kevin

+0

@ केविन मैं हाल ही में क्या कर रहा हूं, लेकिन ब्रूस के जवाब को देखने के बाद मुझे लगता है कि मुझे स्विच करना चाहिए :) –

8

बैकटिक प्राचीन गोले, और इसलिए स्क्रिप्ट (जैसे ग्नू autoconf के टुकड़े के रूप में) पोर्टेबल होने की जरूरत है कि उन्हें पसंद करते हैं चाहिए के साथ संगत कर रहे हैं।

$() फॉर्म आंखों पर थोड़ा आसान है, esp। भागने के कुछ स्तरों के बाद।

+0

"भागने के कुछ स्तरों के बाद" ... आप बैकटिक्स के दूसरे स्तर से कैसे बचते हैं? \\\ '? मैं कभी भी खरगोश छेद से बहुत दूर नहीं गया हूं;) –

+6

चाल यह जानना है कि पीछे की धड़कन खुद से बच जाना चाहिए: 'echo \ 'echo \\' echo \\\\' pwd \\\\ ' \\ '\' ' – phs