2011-05-28 8 views
20

मेरे प्रश्न के पहले भाग में मैं समुदाय को सेवा के रूप में कुछ पृष्ठभूमि जानकारी प्रदान करूंगा। दूसरे भाग में वास्तविक प्रश्न है।बैकस्लाश एलियास विस्तार को क्यों रोकते हैं?

भाग

मान लें मैं निम्नलिखित उर्फ ​​बना लिया है:

alias ls='ls -r' 

मुझे पता है कि अस्थायी रूप से unalias करने (यानी, इस उपनाम को ओवरराइड) का उपयोग निम्नलिखित मायनों में,:

1) कमांड का पूरा पथनाम: /bin/ls

2) आदेश प्रतिस्थापन: $(which ls)

3) आदेश निर्मित: command ls

4) दोहरे उद्धरण चिह्न: "ls"

5) एकल उद्धरण चिह्न: 'ls'

6) एक बैकस्लैश चरित्र: \ls

केस 1 स्पष्ट है और केस 2 बस एक भिन्नता है। 3 मामले में निर्मित कमांड को शैल फ़ंक्शंस को अनदेखा करने के लिए डिज़ाइन किया गया था, लेकिन स्पष्ट रूप से यह उपनामों को रोकने के लिए भी काम करता है। ,

"एक परिणामस्वरूप शब्द है जो की पहचान की है एक साधारण आदेश के आदेश के नाम शब्द की जांच की जाएगी निर्धारित करते हैं कि यह एक गैर उद्धृत है होना करने के लिए: अंत में, मामलों 4 और 5 दोनों POSIX standard (2.3.1) साथ संगत कर रहे मान्य उपनाम नाम। "

और Bash Reference Manual (6.6):

"प्रत्येक सरल आदेश का पहला शब्द, गैर उद्धृत करते हैं, को चेक किया गया है देखें कि क्या वह एक उपनाम है।" क्यों मामला 6 शब्द के हवाले से विचार (\ls कह कर उर्फ ​​अधिभावी) है:

भाग द्वितीय

यहाँ सवाल है? इस प्रश्न की शैली को ध्यान में रखते हुए, मैं "आधिकारिक" दस्तावेज के संदर्भों की तलाश में हूं।

प्रलेखन का कहना है कि एक बैकस्लैश केवल निकल जाता चरित्र निम्नलिखित, के रूप में सिंगल और डबल उद्धरण चिह्न है, जो वर्णों की एक अनुक्रम उद्धृत करने का विरोध किया।POSIX standard (2.2.1):

"एक बैकस्लैश कि उद्धृत नहीं किया गया है निम्न वर्ण के वस्तुतः मान की रक्षा करेगा, एक < न्यू लाइन की अपवाद के साथ>"

Bash Reference Manual (3.1.2.1):

"एक गैर-उद्धृत बैकस्लैश '' बैश एस्केप कैरेक्टर है। यह शाब्दिक को संरक्षित करता है अगले वर्ण का मान न्यूलाइन के अपवाद के साथ। "

(Btw, "अगले वर्ण इस प्रकार है कि" overkill का एक सा नहीं है?) एक संभावित जवाब हो सकता है कि इस स्थिति है कि विशेष नहीं है: यह कुछ के समान है एएनएसआई-सी उद्धरण में मामलों, उदाहरण के लिए \nnn। हालांकि, यह अभी भी से बचने वाला एक एकल वर्ण (आठ-बिट वर्ण जिसका मान ऑक्टल मान एनएनएन है), वर्णों का अनुक्रम नहीं है।

+0

बस ध्यान दें: 6 वें पहले 5 से अलग है: पहला 5 फ़ंक्शन और उपनाम दोनों बाईपास करता है, जबकि '\ ls' (बैश में) केवल उपनाम को बाईपास करता है, न ही उसी नाम का फ़ंक्शन। यानी: 'उपनाम ls =' echo "aliased" '; समारोह ls {echo "फ़ंक्शन"; }; एलएस; \ एलएस; कमांड ls': पहला (एलएस) "एलियाड" दिखाएगा, दूसरा (\ ls) केवल उपनाम को छोड़ देता है और इसलिए "फ़ंक्शन" दिखाता है, और तीसरा (कमांड एलएस) नियमित एलएस –

+0

का आउटपुट दिखाता है यह एक महान है सवाल लेकिन कोई भी स्पष्टीकरण इस मामले पर मेरे किसी भी भ्रम को दूर करने के लिए प्रतीत नहीं होता है। @ alexandros-gezerlis, अगर आप कारण समझने में सक्षम हैं, तो क्या आप इसे मेरे लिए (घर पर लोगों) के लिए वर्तनी कर सकते हैं? – harperville

+0

@OlivierDulac 5 कम से कम जीएनयू बैश में फ़ंक्शन बाईपास नहीं करता है 4.3.11 – jarno

उत्तर

5

ऐतिहासिक रूप से, और पॉज़िक्स द्वारा बनाए रखा गया, शब्द के किसी भी हिस्से को उद्धृत करते हुए पूरे शब्द को कार्यों और उपनाम विस्तार के उद्देश्यों के लिए उद्धृत किया जाता है। (एक आदेश के लिए पूरी खोल पर्यावरण को साफ़ करके)

cat << \EOF 
this $text is fully quoted 
EOF 
+0

धन्यवाद। मैंने स्पष्ट रूप से सोचा था कि मैंने क्या स्पष्ट किया था स्पष्ट करने के लिए मैंने प्रश्न (भाग II में पहला पैराग्राफ) संपादित किया है: मैं एक विशिष्ट उद्धरण की सराहना करता हूं। –

+0

इसके अलावा, मैंने अभी देखा है कि यहां POSIX 2.7.4-दस्तावेज़ स्पष्ट रूप से भागने के मामले को बताते हैं: "यदि शब्द में किसी भी चरित्र को उद्धृत किया गया है, तो शब्द पर उद्धरण हटाने के द्वारा डिलीमीटर का गठन किया जाएगा"। हालांकि, टोकन मान्यता (POSIX 2.3) के सामान्य अनुभाग में यह स्पष्ट रूप से कहा गया है कि यहां दस्तावेज़ विशेष हैं: "इन पंक्तियों को दो प्रमुख तरीकों का उपयोग करके पार्स किया जाएगा: सामान्य टोकन मान्यता और यहां दस्तावेज़ों की प्रसंस्करण।" –

+0

@Alexandros: वे दोनों थोड़ा संदिग्ध हैं। आप अपने पहले उद्धरण के ठीक बाद, खंड 2.7.4 में थोड़ा आगे पढ़ना चाहते हैं: "यदि शब्द में कोई वर्ण उद्धृत नहीं किया गया है, तो यहां दस्तावेज़ के सभी पंक्तियों को पैरामीटर विस्तार, कमांड प्रतिस्थापन और अंकगणितीय विस्तार के लिए विस्तारित किया जाएगा। इस मामले में, इनपुट में बैकस्लैश डबल-कोट्स के अंदर बैकस्लैश के रूप में व्यवहार करता है (डबल-कोट्स देखें)। हालांकि, डबल-कोट वर्ण ('' ') का विशेष रूप से यहां दस्तावेज़ के भीतर नहीं माना जाएगा, सिवाय इसके कि डबल -क्वोट "$()", "' '", या "$ {}" के भीतर प्रकट होता है। " – geekosaur

5

बस पूरा करने के लिए, यहाँ एक और तरीका उर्फ ​​& समारोह लुकअप को दबाने के लिए है: यह भी एक यहाँ दस्तावेज़ के लिए अंत टोकन के हवाले से लागू होता है

# cf. http://bashcurescancer.com/temporarily-clearing-environment-variables.html 
env -i ls 
संबंधित मुद्दे