कैसे एक उपनाम, समारोह, फ़ाइल, आदि का संदर्भ करने के लिए एक बाश शब्द मजबूर करने के लिए?


13

जब एक संबंधित प्रश्न के लिए थोड़ा और विस्तार करने की कोशिश कर रहा है, तो मुझे एहसास हुआ कि मुझे यह नहीं पता कि किस तरह से निर्दिष्ट करने के लिए उपलब्ध बैश शब्द प्रकारों में से एक को निष्पादित करना है। के अनुसार help typeपाँच शब्द प्रकार हैं:

  • उपनाम
  • कीवर्ड
  • समारोह
  • builtin
  • फ़ाइल

एक शब्द के कई प्रकार के होने की संभावना है ( trueयह सिर्फ एक उदाहरण है; एक अधिक सामान्यतः अप्रभावित शब्द होगा cd)

$ type -a true
true is a shell builtin
true is /bin/true

आप एक विशिष्ट पर्याय के निष्पादन को कैसे मजबूर करते हैं? अब तक, पूर्वता क्रम में:

  • उपनाम: यह एक विशेष मामला है क्योंकि इसमें अन्य सभी समानार्थक शब्दों की पूर्वता है। यह जबरदस्ती केवल तभी उपयोगी होगी जब कमांड को विफल कर दिया जाना चाहिए, यदि उर्फ ​​को परिभाषित नहीं किया गया है।

    $ 
  • कीवर्ड:

    $ 
  • समारोह:

    $ 
  • निर्मित:

    $ builtin true
  • फ़ाइल:

    $ command true
    $ $(which true)
    $ /bin/true

आंशिक समाधान :

  • एक शब्द का उद्धरण उपनाम और कीवर्ड को छोड़कर। अर्थात्,

    $ 'true'

    केवल फ़ंक्शन, बिलिन या फ़ाइल चलाएगा।

जवाबों:


10

आप जो पूछ रहे हैं वह वास्तव में बहुत मायने नहीं रखता है।

कीवर्ड का मतलब है कि यह एक शब्द है जो शेल के सिंटैक्स का हिस्सा है। जिन्हें टोकन के जरिए पहचाना जाता है। उन्हें खोलना पहचानने के लिए खोलना काफी है।

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

एलियासेस (zsh के अपवाद के साथ परिभाषित अलियास alias -gकेवल कमांड स्थिति में विस्तारित हैं), इसलिए आमतौर पर इसमें नहीं builtin the-alias

फ़ंक्शंस में निर्मितियों, और बाहरी आदेशों पर निर्मितियों की पूर्वता होती है (और फिर $PATHनिर्णय लिया जाता है कि किसका उपयोग करना है)।

आप बिलिन के साथ जबरदस्ती कर सकते हैं:

builtin the-cmd and its args

(हालांकि यह ध्यान दिया जाना चाहिए कि यह एक मानक कमांड नहीं है)।

आप उन्हें उद्धृत करके उपनामों को निष्क्रिय कर सकते हैं (हालांकि उद्धृत संस्करण को कुछ गोले में भी अलियास किया जा सकता है)।

तो, उदाहरण के लिए (यहाँ zsh वाक्यविन्यास):

'while'() echo function while
alias 'while=echo alias while'

लेखन while trueवास्तव में आउटपुट होगा alias while true, और whileकीवर्ड का उपयोग करने का कोई तरीका नहीं होगा क्योंकि इसे उद्धृत करने से उपनाम और कीवर्ड दोनों अक्षम हो जाएंगे।

आप whileउदाहरण के लिए फ़ंक्शन को कॉल करेंगे :

'whi'le whatever

अगर कोई whileबिलिन था (लेकिन निश्चित रूप से उन गोले में नहीं होगा जिनके पास whileकीवर्ड है), तो आप इसे लिखेंगे:

builtin while whatever

और whileकमांड को कॉल करने के लिए , आप लिखेंगे:

env while whatever

या zsh(जब shअनुकरण में नहीं ):

command while whatever 

(अन्य गोले में, commandकेवल कार्यों को रोकता है, निर्मित नहीं)

या

/full/path/to/while whatever

बेशक, कुछ भी नहीं है आप भी sillier बातें करने से रोक रहा है जैसे:

alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }

जो, कम से कम zsh में मान्य (लेकिन मूर्ख) है।


उद्धरण अलियास लुकअप को दबाता है, और command फ़ंक्शन लुकअप को दबा देता है, लेकिन इनमें से कोई भी निर्दिष्ट नहीं है कि शेष पर्यायवाची में से किसका उपयोग किया जाएगा। मैं केवल एक विशिष्ट पर्याय को निष्पादित करने के लिए निर्दिष्ट करने के लिए एक रास्ता खोज रहा हूं ।
l0b0

@ l0b0 "कमांड" सभी उपनामों, कीवर्ड और बिलिन को दबा देता है।
स्टीफन चेज़लस

समझ बनाने के लिए, builtinउदाहरण के लिए RVM का उपयोग cdअच्छे प्रभाव के लिए ओवरराइड करने के लिए किया जाता है ।
l0b0

आप सही हे; और मैंने अभी सत्यापित किया है कि यह कार्यों को भी दबा देता है। +1।
l0b0

0

मेरे लिए एक अत्यंत उपयोगी मुहावरा यह है:

FALSE=1; TRUE=0
DEVEL_FLAG=$FALSE
...
in_development() { return $DEVEL_FLAG ; }
cd()
{
 if in_development ; then # -D argument to script toggles development flag
   echo "Would run cd $*"
  else
   builtin cd "$@"
 fi
}

अब अगर मैं स्क्रिप्ट को -D निर्दिष्ट के साथ चलाता हूं, तो विकास मोड सक्रिय हो जाता है, और सीडी (या कोई अन्य लिपटे हुए कमांड) echest डेबिट जानकारी

यह विशेष रूप से स्क्रिप्ट के साथ उपयोगी है जो ssh चलाते हैं। यकीन है कि मैं सेट -x को टॉगल कर सकता हूं, लेकिन यह मेरे लिए अधिक उपयोगी और पठनीय है।


1
यह प्रश्न का उत्तर कैसे देता है?
l0b0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.