खोल में "बोली" आदेश


15

कमांड का उपयोग क्या है quote? मुझे इसके बारे में कोई जानकारी नहीं मिली है, यह /binफ़ोल्डर्स में निष्पादन योग्य फ़ाइलों के बीच नहीं है , और इसे बाश बिल्ट-इन के बीच नहीं पाया जा सकता है। ऐसा लगता है कि यह केवल अपने पहले पैरामीटर को प्रिंट करता है, जैसे एक echoकमांड और अधिक कुछ नहीं।


यह सिर्फ उद्धरण जोड़ता है
हकीम वहाब

1
बस इधर-उधर ताकते हुए, मुझे शेल-कोट नामक एक उपयोगिता मिली, जो कि उद्धरण के समान है, लेकिन इसमें एसश जैसी चीजों के साथ और बैश स्क्रिप्ट को डीबग करने के लिए कुछ उपयोग हैं। सोचा था कि मैं इसे यहाँ फुटनोट के रूप में शामिल करूँगा। ' linux.die.net/man/1/shell-quote '
जो

डब्ल्यूटीएफ की तरह लगता है कि इस तरह के एक सामान्य शब्द है, quoteइस तरह के अस्पष्ट उद्देश्य के लिए उपयोग किया जाता है ... इसे "आंतरिक", कोई प्रलेखन, चिह्नित करने के लिए कोई उपसर्ग नहीं, कुछ भी नहीं, जब तक कि आप डिस्ट्रो के उन्नत पूर्ण यांत्रिकी के कार्यान्वयन विवरण में खुदाई नहीं करते हैं। मुझे यह थोड़ा परेशान लगता है।
हाईड

यह उस व्यक्ति के लिए और भी अधिक अस्पष्ट हो जाता है, जिसकी मूल भाषा अंग्रेजी नहीं है। उदाहरण के लिए, मेरी तरह। :)
रात

जवाबों:


10

यह क्या है?

मैंने देखा कि यह कमांड मेरे शेल ( फिश, फ्रेंडली इंटरएक्टिव शेल ) में काम नहीं करता है । ऐसा लगता है कि यह केवल बैश (उबंटू के डिफ़ॉल्ट) में काम करता है।

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

यह क्या करता है? इसका क्या उपयोग किया जा सकता है?

यह उद्धरण जोड़ता है लेकिन कोई नई पंक्ति नहीं। यह एक तरह से सिंगल कोट्स से बच जाता है जो बैश के लिए उपयुक्त है। यह एक चर या किसी अन्य प्रकार की स्ट्रिंग को उद्धृत करने के लिए लिपियों में उपयोगी हो सकता है। आपको उदाहरण के लिए रिक्त स्थान के साथ पथ / मापदंडों के लिए इसकी आवश्यकता है। हालांकि ऐसा करने के अन्य तरीके भी हैं।

यह वास्तव में अजीब है कि मैं इसके बारे में (वेब ​​में) कोई प्रलेखन नहीं पा सका। लेकिन ठीक है, यह देखना आसान है कि यह क्या करता है।


2
whichइंटरैक्टिव गोले और लिपियों में दोनों बेकार है। typeइसके बजाय उपयोग करें । type quoteआपको बताएगा कि यह एक फ़ंक्शन है, और फ़ंक्शन की परिभाषा भी दिखाता है। बिलिन help typeपर अधिक के लिए चलाएँ type
जिरिहा

तुम सही हो, धन्यवाद। मैंने ऊपर का उत्तर देखा, जिसमें यह पता लगाने के लिए कि यह क्या है, का उपयोग किया गया था। खैर, 'जो' के लिए धन्यवाद कि मुझे पता था कि यह / बिन / या तो एक निष्पादन योग्य नहीं था, क्योंकि यह कोई रास्ता नहीं लौटाता था। मुझे लगता है कि यह अभी भी उपयोगी था। लेकिन आप सही हैं, मैं टाइप करूंगा।
वृहस्पति

2
मेरे Ubuntu 12.04 में इस फ़ंक्शन को वास्तव में वर्णित किया गया है /etc/bash_completion, जो ~/.bashrcडिफ़ॉल्ट रूप से खट्टा है , न कि /etc/bash.bashrcजहां से संबंधित अनुभाग /etc/bash_completionपर टिप्पणी की गई है। /usr/share/bash-completion/उबंटू 12.04 में भी फोल्डर अनुपस्थित है।
रात

8

quoteएक ऐसा फंक्शन है जिसे परिभाषित किया गया है (यहाँ मेरे डेबियन सिस्टम पर, लेकिन मुझे लगता है कि यह उबंटू में /usr/share/bash-completion/bash_completionभी ऐसा ही है ) , जो कि खुद /etc/bash.bashrcबैश के स्टार्टअप पर है।

मैं इस फ़ंक्शन का उपयोग कभी नहीं करूंगा! यदि आपको किसी शेल द्वारा सुरक्षित रूप से उपयोग करने योग्य सामान को उद्धृत करने की आवश्यकता है, तो कृपया संशोधक के printfसाथ प्रयोग करें %q, जैसे:

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

वास्तव में, यहां तक ​​कि यह बहुत कम ही उपयोग किया जाता है, उच्च स्तरीय सामान के लिए हमेशा बेहतर रणनीति होती है जैसा कि हम, उपयोगकर्ता, आमतौर पर करते हैं। इस quoteचीज़ का उपयोग कुछ अस्पष्ट सामानों द्वारा आंतरिक रूप से किया जाता है जिनके बारे में हम जानना भी नहीं चाहते हैं। यह quoteफ़ंक्शन संभवतः एक विक्रेता / वितरण-विशिष्ट (पढ़ें डेबियन-विशिष्ट) है और संभवतः बिल्कुल पोर्टेबल नहीं है, और भविष्य के रिलीज में भी बदल सकता है।

संपादित करें। मैंने अभी एक उबंटू 12.04 सिस्टम पर जाँच की है, और quoteफ़ंक्शन द्वारा परिभाषित किया गया है /etc/bash_completion, द्वारा sourced /etc/bash.bashrc, स्वयं द्वारा sourced /etc/profile

मैंने यह कैसे निर्धारित किया? थोड़ा सा प्रयोग करके:

  • इसमें quoteदिखाई देने पर जांचें /etc/profile:

    grep '\bquote\b' /etc/profile

    नहीं। अगले चरण पर जाएं।

  • फाइलों को किसके द्वारा सीज किया गया है /etc/profile?

    grep '[[:space:]]\.[[:space:]]' /etc/profile

    मेरे पास है $i(क्या यह स्रोतों के लिए स्रोत पर गौर करने की जरूरत है, लेकिन इस मामले में यह फ़ाइलें है /etc/profile.d/*.sh, यदि कोई हो (और पठनीय है) और /etc/bash.bashrc। में देख रहे हैं /etc/bash.bashrc

  • है quoteमें /etc/bash.bashrc? हाँ / नहीं, आदि ...

quoteवास्तव में सिंगल कोट्स से बच जाता है, इसलिए यह शेल द्वारा प्रयोग करने योग्य है। यह सिर्फ printf %qइस उपयोग के मामले के लिए काम करता है ।
फ्लिम

@ अपने खुद के जोखिम पर उपयोग करें!
गनीउरफ_निगियॉर्फ

@gniourf_gniourf मुझे लगता है कि printf% q ठीक से tilde ( ~ ) को हैंडल नहीं करता है । इस प्रयास करें: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")"। आप कुछ इस तरह देखेंगे Expected: ~/.bashrc, quote: ~/.bashrcऔर printf %q: /home/your_username/.bashrc
रॉकलाईट

1
@Rockallite: मैं बस इसे करने की कोशिश है और यह एक उम्मीद काम करता है ...
gniourf_gniourf

यदि आप स्रोत को सीधे छोड़ना चाहते हैं, तो आप उपयोग कर सकते हैं (shopt -s extdebug; declare -F quote), जो आपको फ़ंक्शन का नाम, लाइन नंबर यह परिभाषित करता है, और फ़ाइल नाम इसे परिभाषित करता है।
wjandrea

3

quote एक समारोह है:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

यह फ़ंक्शन बैश इनिशियलाइज़ेशन फ़ाइल में कहीं परिभाषित किया गया है। अधिक सटीक रूप से, यदि आप उबंटू 13.04 का उपयोग कर रहे हैं, तो आप इसे /usr/share/bash-completion/bash_completionलाइन 142 पर पा सकते हैं ।

इसे जांचने के लिए निम्नलिखित कमांड का उपयोग करें:

type quote

इसका उद्देश्य स्पष्ट है।


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