2014-11-24 4 views
6

लगभग हर जगह मैंने पढ़ा है, जिसमें Google की बैश स्क्रिप्टिंग शैली मार्गदर्शिका उद्धरण आदेश प्रतिस्थापन (विशेष रूप से निश्चित रूप से वांछित होने के अलावा) की आवश्यकता के अनुसार उल्लेख किया गया है।क्या बैश में परिवर्तनीय असाइनमेंट के दौरान कमांड प्रतिस्थापन उद्धृत करना आवश्यक है?

मैं सामान्य उपयोग के दौरान कमांड प्रतिस्थापन उद्धृत करने के समय/कहां/क्यों समझता हूं। उदाहरण के लिए: echo "$(cat <<< "* useless string *")" बल्कि echo $(...) से

हालांकि चर कार्य के लिए विशेष रूप

, मैं इतने सारे उदाहरण इस तरह के रूप में देखा है: variable="$(command)"

अभी तक मैं कोई उदाहरण जहां variable=$(command) बराबर नहीं है मिल गया है।

variable="$(echo "*")" और variable=$(echo "*") दोनों मूल्य '*' पर सेट करते हैं।

कोई भी ऐसी स्थितियों को दे सकता है जहां परिवर्तनीय आकलन के दौरान प्रतिस्थापन को छोड़कर वास्तव में समस्या हो सकती है?

+0

अच्छा सवाल! मैंने कई परीक्षण किए और ऐसा लगता है कि वे बिल्कुल वही हैं, कोई फर्क नहीं पड़ता। – fedorqui

+0

मुझे लगता है कि वह जिस मुद्दे के बारे में पूछ रहा है वह $ cmd, $ {cmd} के साथ हो सकता है। प्रतिस्थापन में और अगर खंड में, हमें वहां "" आवश्यकता है। अगर मैं गलत हूं तो कृपया सही करें –

उत्तर

6

शैल परिवर्तनीय असाइनमेंट के लिए शब्द विभाजन निष्पादित नहीं करता है (यह पॉज़िक्स द्वारा इस तरह मानकीकृत है और आप उस पर भरोसा कर सकते हैं)। इस प्रकार आप दोहरे उद्धरण चिह्नों की जरूरत नहीं है (लेकिन आप परिणाम अलग किए बिना उनका उपयोग कर सकते)

variable=$(command) # same as variable="$(command)" 

हालांकि में, शब्द-बंटवारे,

echo $(command) 
echo "$(command)" 

परिणाम हो सकता है में हैं, इसलिए आदेशों से पहले किया जाता है अलग बनो। उत्तरार्द्ध सभी मल्टी-स्पेस दृश्यों को रखता है, जबकि पूर्व प्रत्येक शब्द को गूंजने के लिए एक अलग तर्क बनाता है। यह तय करने के लिए आप पर निर्भर है कि वांछित व्यवहार कौन सा है।

दिलचस्प शेल क्विर्क: एक और जगह है जहां एक प्रतिस्थापन उद्धृत किया गया है या कोई फर्क नहीं पड़ता है, अर्थात् case expr in निर्माण में अभिव्यक्ति।

case $FOO in 
    (frob) ...;; 
esac 

बहुत से अलग आदेशों के साथ

case "$FOO" in 
    (frob) ...;; 
esac 
+2

यही जवाब यही है। –

+0

क्या आप पीओएसईक्स मानक के सटीक हिस्से के लिए एक लिंक दे सकते हैं जहां इसकी आवश्यकता है? मुझे इसे खोजने में परेशानी है। – Lucas

+2

@ लुकास मैं 2.9.1 सरल कमांड, # 4 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01: * "प्रत्येक परिवर्तनीय असाइनमेंट को टिल्डे विस्तार, पैरामीटर के लिए विस्तारित किया जाएगा विस्तार, कमांड प्रतिस्थापन, अंकगणितीय विस्तार, और मूल्य निर्दिष्ट करने से पहले उद्धरण हटाने। "* यह शब्द-विभाजन नहीं कहता है। – Jens

-2

परीक्षण से पृथक है, यह एक ही है। कोई अंतर नहीं मिल रहा है

variable="$(command)" 
variable=$(command) 

इन दो नहीं हैं, जबकि:

echo $(command) 
echo "$(command)" 

ओह, मानव मस्तिष्क एक कंप्यूटर नहीं है

+1

यह प्रश्न का उत्तर नहीं है। और एक अंतर देखने के लिए 'echo "(echo -e" हैलो \ nworld ")' echo -e" हैलो \ nworld ")" echo -e "हैलो \ nworld") "echo -e" हैलो \ nworld ")" ' – jeb

4

मार उपयोग करते समय, उन दो पंक्तियों 100% के बराबर हैं। जब नौकरी दोहराने की बात आती है तो यह विशेष रूप से भरोसेमंद नहीं है।

तो संभावना है कि यदि आप शैलियों को मिश्रित करते हैं (यानी आप कमांड तर्कों का उपयोग करते समय उद्धरण देते हैं लेकिन जब आप एक चर निर्दिष्ट करते हैं तो उद्धरण नहीं देते हैं), कि एक बार में, आप इसे गलत समझेंगे।

इससे भी बदतर, एक बार आप कमांड परिणाम अलग-अलग शब्दों में विस्तारित करना चाहते हैं। और अगला कोड जो आपका कोड पढ़ता है उसे आश्चर्य होगा कि क्या वह एक बग देख रहा है।

संकलन: चूंकि पहली दो पंक्तियां समान हैं, इसलिए औसत मस्तिष्क को $() (यहां तक ​​कि जब आवश्यक नहीं है) को हमेशा उद्धृत करना आसान होता है ताकि यह सुनिश्चित किया जा सके कि आप हमेशा उद्धरण देते हैं।

+2

ठीक है, तो यह समझ में आता है कि इसकी अनुशंसा क्यों की जाती है अक्सर ... जब मैंने पहली बार शैल स्क्रिप्ट लिखना शुरू किया, तो मैंने सामान्य नियम के रूप में उद्धरण दिया। अब जब मैं इससे ज्यादा परिचित हूं तो मैं कुछ भी अनावश्यक या अनावश्यक को खत्म करने की कोशिश करता हूं। – Six

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