मैं शेल उपनामों को "स्टैक" कैसे कर सकता हूं?


12

मेरे .profile( मेरे shसे अनुकरण मोड में खट्टा .zshrc) मेरे पास निम्नलिखित स्निपेट हैं:

if [ -f /usr/bin/pacmatic ]; then
    alias pacman=pacmatic
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

हालांकि, दूसरा उर्फ ​​हमेशा पहला ओवरराइड करता है:

% type pacman
pacman is an alias for pacman --color auto

मैं इसे कैसे बना सकता हूं ताकि दूसरा अलियास असाइनमेंट "असाइनमेंट" को पहला असाइनमेंट मिले, ताकि यदि /usr/bin/pacmaticमौजूद हो, तो एलियास बन जाए pacmatic --color auto?

मैं उपनामों के बजाय फ़ंक्शंस का उपयोग करने का विरोध नहीं कर रहा हूं, लेकिन अगर हर बार तर्क का प्रदर्शन नहीं किया जाता है, तो मैं इसे पसंद करूंगा pacman(मुझे pacmaticएक बार के लिए जाँच की जाती है, शेल स्टार्टअप पर, हर बार नहीं pacmanचलाया जाता है)। मैं sh-पोर्टेबल स्क्रिप्ट भी पसंद करूंगा, लेकिन अगर यह संभव नहीं है, तो आप पूर्ण zshवाक्य रचना का उपयोग कर सकते हैं ।

(हां, मुझे पता है कि यह आसानी --color autoसे pacmaticउपनाम से जोड़कर हल किया जा सकता है । लेकिन मैं इसे सही तरीके से करना चाहता हूं।)

मैंने Googling और मैनपेज़ के माध्यम से देखने की कोशिश की है, लेकिन कोई फायदा नहीं हुआ।


मुझे लगा कि राइट वे अलायस के बजाय फ़ंक्शंस का उपयोग करना था। मैंने सुना है कि वे उपनाम (कम से कम bash) से तेज़ हैं , और वे आसानी से एक दूसरे को कॉल कर सकते हैं।
वुटज़

जवाबों:


5

एक शेल एक के aliasसमान सुंदर व्यवहार करता है #define, अर्थात शेल उपनाम को फिर से परिभाषित करना पिछले एक को ओवरराइड करेगा।

मुझे यकीन नहीं है कि राइट वे टीएम क्या होगा , लेकिन एक दृष्टिकोण एक शेल फ़ंक्शन का उपयोग करेगा जो मापदंडों को स्वीकार करता है और एक उपनाम बनाने के लिए उपयोग करता है। आपके कोड स्निपेट को फिर से लिखा जा सकता है:

if [ -f /usr/bin/pacmatic ]; then
    pacman() { pacmatic "$@"; }
fi

# Colorized Pacman output
alias pacman="pacman --color auto"

 


इसके अलावा, भले ही आप अलग-अलग उपनामों का उपयोग कर रहे थे और दूसरे को परिभाषित करने के लिए एक का उपयोग करने की कोशिश कर रहे थे, यह काम नहीं करेगा क्योंकि उपनाम डिफ़ॉल्ट रूप से गैर-संवादात्मक मोड में विस्तारित नहीं हैं। आपको सेटिंग करके इसे सक्षम करना होगा expand_aliases:

shopt -s expand_aliases

मैनुअल से उद्धरण:

   Aliases are not expanded when the shell is not interactive, unless  the
   expand_aliases  shell option is set using shopt (see the description of
   shopt under SHELL BUILTIN COMMANDS below).

मैं जो चाहता हूं, उसके सबसे करीब यह प्रतीत होता है, लेकिन यह काम नहीं करता है। type pacmanरिटर्न pacman is an alias for pacman --color auto, shएमुलेशन मोड में और देशी zshमोड में। हालाँकि, जैसा आप संपादित करते हैं वैसा ही दिखता है, जिसकी मुझे आवश्यकता है।
स्ट्रूजी

FWIW, zsh समकक्ष है setopt aliases
3

ओपी उपयोग कर रहा है zsh। और शैल वैसे भी इंटरेक्टिव प्रतीत होता है।
मिकेल

6

इंटरएक्टिव स्रोतों से लाइनों को पढ़ते समय उपनाम का प्रतिस्थापन केवल किया जाता है। तो दूसरा उर्फ ​​पहले से प्रभावित नहीं है, इसलिए शाब्दिक प्रतिस्थापन।

शायद कुछ इसी तरह:

PACMAN=pacman
if [ -f /usr/bin/pacmatic ]; then
    PACMAN=pacmatic
fi

# Colorized Pacman output
alias pacman="${PACMAN} --color auto"

यह 'pacman' को उचित मूल्य पर सेट करेगा, PACMAN env वैरिएबल को निर्यात नहीं किया गया है, इसलिए यह स्क्रिप्ट के खत्म होने पर चला जाएगा, और "दोहरे उद्धरण चिह्नों" का उपयोग यह सुनिश्चित करेगा कि परिवर्तनशील प्रतिस्थापन उपनाम की घोषणा में होता है, प्रत्येक आह्वान के लिए नहीं।

मैं एक समान विधि का उपयोग करता हूं:

PACMAN=pacman
which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN} --color auto"

मूल रूप से, env var PACMAN सेट करें, पथ में pacmatic के लिए परीक्षण करें, यदि पाया जाता है, PACMAN सेट करें, तो अन्य भिन्नता निर्धारित करें।

हम्म, आप थोड़ा और अधिक अनुकूलित कर सकते हैं ...

which pacmatic &>/dev/null && PACMAN=pacmatic
alias pacman="${PACMAN:-pacman} --color auto"

ता दा! यदि PACMAN परेशान या अशक्त है, तो 'pacman' पर सेट करें, अन्यथा, PACMAN के मान पर, 'जो' पंक्ति द्वारा pacmatic पर सेट करें।


उपनाम केवल "इंटरैक्टिव स्रोतों" के लिए काम क्यों करेंगे?
मिकेल

आप सही हैं कि डिफ़ॉल्ट रूप से, bashगैर-संवादात्मक मोड में उपनामों का विस्तार नहीं करता है, लेकिन यह कैसे "इंटरैक्टिव स्रोतों" के समान है?
मिकेल

2

Zsh में, आप आसानी से aliasesसहयोगी सरणी का उपयोग करके एक उपनाम के लिए अपील कर सकते हैं :

alias pacman="${aliases[pacman]-pacman} --color auto"

अन्य गोले में, आपको aliasमौजूदा उपनामों के बारे में जानने के लिए कमांड के आउटपुट का उपयोग करने की आवश्यकता है ।

current_pacman_alias=$(alias pacman 2>/dev/null)
alias pacman="${current_pacman_alias:-pacman} --color auto"

जब मैं इसे एक संभावना के रूप में पेश कर रहा हूं, तो मैं एक चर का उपयोग करने के साथ जाऊंगा जैसा कि पहले से ही अन्य उत्तरों द्वारा सुझाया गया है। यह स्पष्ट है, और आप चर के मूल्य में भेदभाव कर सकते हैं यदि आप कुछ चीजों को अलग-अलग तरीके से कॉन्फ़िगर करना चाहते हैं जिसके आधार पर कोई एक pacmaticया pacmanउपयोग में है।

pacman==pacmatic 2>/dev/null || pacman=pacman
alias pacman='$pacman --color auto'


0
pacman() ( def_args="--color auto" bin=
    [ -x ${bin:=/usr/bin/pacmatic} ] || bin=
    [ -x ${bin:=/usr/bin/pacman} ] || bin= 
    ${bin:?WHERE THE HELL IS PACMAN????} \
        $def_args "$@"
)

उपनाम पक्षियों के लिए हैं।

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