बैश उपनाम - वरीयता/छायांकन (/छिपाना/असफल होना)

Aug 17 2020

मेरे पास .bashrc में कुछ उपनाम सेटअप हैं (इस क्रम में):

alias ls="lsc"
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'

aliasसोर्सिंग के बाद उनकी पुष्टि करना :

alias ls='lsc'
alias lsc='ls -Flatr --color=always'
alias lscR='ls -FlatrR --color=always'

मैं नए lsअलियास को ठीक से चला सकता हूं, और यह lsc उपनाम के माध्यम से जंजीर करता है, और फिर lsc उपनाम से जुड़े कमांड को निष्पादित करता है। मैं दौड़ भी सकता हूं lscRऔर यह उम्मीद के मुताबिक काम करता है।

अगर मैं lscखुद को चलाने की कोशिश करता हूं, तो मुझे मिलता है:

$ lsc
lsc: command not found

किसी भी विचार से शेल इस परिदृश्य में lsc उपनाम को छायांकन/छुपाता हुआ क्यों प्रतीत होता है? (मुझे एहसास है कि 'एलएससी' चलाने के लिए यह व्यर्थ है जब मैं यहां एक ही परिणाम प्राप्त करने के लिए 'एलएस' चला सकता हूं, लेकिन मैं इस परिदृश्य में गोले व्यवहार को समझने की कोशिश कर रहा हूं)।

संपादित करें: प्रश्न उत्तर में प्रदान किए गए (बैश) शेल व्यवहार के लिए नीचे दिए गए समाधान।

मूल प्रश्न के कुछ वास्तव में सहायक उत्तर प्रदान किए गए हैं। उत्तरों में बताए गए विस्तार व्यवहार को शॉर्ट-सर्किट करने के लिए, दूसरे उपनाम को रोकने के कम से कम दो तरीके प्रतीत होते हैं, एक कमांड का विस्तार करने की कोशिश करने से जिसे आपने पहले ही अलियास कर दिया है। उदाहरण के लिए, यदि आपके पास , alias cmd='cmd --stuff'नामक नेटिव कमांड को ओवरराइड कर रहा है , तो cmdआप 'cmd' एलियास को cmdअन्य एलियासेस में नेटिव के स्थान पर इस्तेमाल होने से रोक सकते हैं:

(इस पहले दृष्टिकोण के लिए wjandrea की टिप्पणी के लिए धन्यवाद)

  1. cmdअन्य उपनाम जैसे 'कमांड' के साथ उपसर्ग करनाalias other-cmd-alias='command cmd --other-stuff'

या,

  1. इसी तरह, आप उपनामों से बच सकते हैं (जैसा कि आप कमांड लाइन पर भी कर सकते हैं), अन्य उपनामों के भीतर एक बैकस्लैश '' के साथ उपसर्ग करके, उदाहरण के लिए alias other-cmd-alias='\cmd --other-stuff'

जवाब

13 John1024 Aug 17 2020 at 11:58

बैश उपनामों को उपनाम रखने की अनुमति देता है लेकिन इसमें अनंत लूप के खिलाफ अंतर्निहित सुरक्षा है। आपके मामले में, जब आप टाइप करते हैं , तो lscबैश पहले उपनाम का विस्तार करता है:

ls -Flatr --color=always

चूँकि lsएक अन्य नाम भी है, बैश इसका विस्तार करता है:

lsc -Flatr --color=always

lscएक उपनाम है लेकिन, काफी समझदारी से, बैश इसे दूसरी बार विस्तारित करने से मना कर देता है । अगर नाम का कोई प्रोग्राम lscहोता, तो बैश उसे चला देता। लेकिन, ऐसा नहीं है और इसीलिए आपको मिलता है command not found

परिशिष्ट

जब lscRचलता है तो अलग होता है। lscRइसका विस्तार होता है:

ls -FlatrR --color=always

चूँकि lsएक उपनाम है, यह इस तक विस्तृत है:

lsc -FlatrR --color=always

चूँकि lscएक उपनाम है, यह इस तक विस्तृत है:

ls -Flatr --color=always -FlatrR --color=always

चूंकि पहले ही एक बार विस्तार किया जा चुका है, बैश इसे दूसरी बारls विस्तारित करने से मना कर देता है । चूंकि एक वास्तविक आदेश मौजूद है, इसे चलाया जाता है।ls

इतिहास

जैसा कि टिप्पणियों में शिली ने उल्लेख किया है, बैश ने ksh से दूसरी बार उपनाम का विस्तार नहीं करने की अवधारणा उधार ली है ।

अलग

उपनाम उपयोगी हैं लेकिन बहुत शक्तिशाली नहीं हैं। यदि आप एक उपनाम के साथ कुछ जटिल करने के लिए ललचाते हैं, जैसे कि तर्क प्रतिस्थापन, नहीं; इसके बजाय शेल फ़ंक्शन का उपयोग करें।

6 muru Aug 17 2020 at 12:00

बैश मैनुअल से :

प्रतिस्थापन पाठ का पहला शब्द उपनामों के लिए परीक्षण किया गया है, लेकिन एक शब्द जो एक उपनाम के समान है, का विस्तार दूसरी बार नहीं किया गया है। इसका मतलब यह है कि कोई व्यक्ति ls" ls -F" के लिए उपनाम कर सकता है, उदाहरण के लिए, और बैश प्रतिस्थापन पाठ को पुनरावर्ती रूप से विस्तारित करने का प्रयास नहीं करता है।

lsएलियास में, को और फिर से तक lsविस्तारित किया जाता है , और वहाँ अलियास विस्तार बंद हो जाता है, क्योंकि मूल रूप से इसका विस्तार किया जा रहा था। तो, आदेश ठीक चलता है, अब बाहरी कमांड को हल किया जा रहा है।lscls -Flatr --color=alwayslsls

lscउपनाम में, तक lscविस्तारित किया जाता है ls -Flatr --color=always, और उसके बाद lsअब विस्तारित किया जाता है lscऔर वहां उपनाम विस्तार बंद हो जाता है, क्योंकि lscमूल रूप से विस्तारित किया जा रहा था। इसलिए, आदेश विफल हो जाता है, क्योंकि बैश किसी अन्य के बारे में नहीं जानता है lsc