उपधारा / बाल प्रक्रिया में उपनाम


16

मैंने प्रत्येक लॉगिन शेल के लिए /etc/profile.d/alias.sh में उपनाम सेट किए। लेकिन अगर मैं script.sh चलाऊं, तो मैं उस उपनाम का उपयोग नहीं कर सकता। मैं उप-स्तरीय या बाल प्रक्रियाओं के लिए भी उपनाम कैसे सेट कर सकता हूं?

/etc/profile.d/alias.sh

alias rmvr='rm -rv';
alias cprv='cp -rv';
alias mvrv='mv -rv';

जवाबों:


24

उपनाम विरासत में नहीं मिले हैं। यही कारण है कि वे परंपरागत रूप से सेट हैं bashrcऔर नहीं profile। इसके बजाय script.shअपने .bashrcया अपने सिस्टम-वाइड से स्रोत का उपयोग करें।


इनहेरिट करके, आपका मतलब है कि निर्यात किए गए चर विरासत में मिले हैं और बाकी नहीं है?
lisak

1
मुझे नहीं लगता कि .bashrc में मदद करता है ... आप एक subshell में तो है कि अन्य नाम का उपयोग करते हैं, यह यह पता नहीं है है
Lisak

bashrc को सभी इंटरएक्टिव नॉन-लॉगिन शेल के लिए पढ़ा जाता है, यही कारण है कि यह काम करना चाहिए क्योंकि आपके द्वारा शुरू किए गए अधिकांश शेल इंटरएक्टिव नॉन-लॉगिन शेल होते हैं, और एलियास सब()
हेल्प

मैं aliasName () मंगलाचरण के बारे में पता नहीं था, धन्यवाद
Lisak

बस स्पष्ट होने के लिए, जो मेरा मतलब था वह बकवास में था alias foo='echo foobar', दर्ज करें, (foo)आउटपुट foobar
jw013

11

ऐसा इसलिए है क्योंकि /etc/profile.d/ का उपयोग केवल इंटरेक्टिव लॉगिन शेल द्वारा किया जाता है। हालांकि, /etc/bash.bashrcइंटरएक्टिव नॉन-लॉगइन शेल द्वारा उपयोग किया जाता है।

जैसा कि मैं आमतौर पर सिस्टम के लिए कुछ वैश्विक उपनाम सेट करता हूं, मैंने बनाना शुरू कर दिया है /etc/bashrc.dजहां मैं कुछ वैश्विक उपनामों के साथ एक फ़ाइल छोड़ सकता हूं:

    HAVE_BASHRC_D=`cat /etc/bash.bashrc | grep -F '/etc/bashrc.d' | wc -l`

    if [ ! -d /etc/bashrc.d ]; then
            mkdir -p /etc/bashrc.d
    fi
    if [ "$HAVE_BASHRC_D" == "0" ]; then
        echo "Setting up bash aliases"
            (cat <<-'EOF'
                                    if [ -d /etc/bashrc.d ]; then
                                      for i in /etc/bashrc.d/*.sh; do
                                        if [ -r $i ]; then
                                          . $i
                                        fi
                                      done
                                      unset i
                                    fi
                            EOF
            ) >> /etc/bash.bashrc

    fi

8

यदि आप चाहते हैं कि उन्हें उप-गोले विरासत में मिले, तो इसके बजाय कार्यों का उपयोग करें। उन्हें पर्यावरण ( export -f) में निर्यात किया जा सकता है , और उप-गोले के बाद उन कार्यों को परिभाषित किया जाएगा।

तो, आपके एक उदाहरण के लिए:

rmvr() { rm -rv "$@"; }
export -f rmvr

यदि आपके पास उनमें से एक गुच्छा है, तो पहले निर्यात के लिए सेट करें:

set -a # export the following funcs
rmvr() { rm -rv "$@"; }
cpvr() { cp -rv "$@"; }
mvrv() { mv -rv "$@"; }
set +a # stop exporting

0

इसी तरह के सवाल पर, मैं बैश "कमांड मोड" चलाना चाहता था और एलियास उपलब्ध था:

bash -i 'alias'कुछ नहीं करता। लेकिन मैंने -i ध्वज की खोज की जो इंटरेक्टिव सेटअप चलाता है, इसलिए यह bash -ci 'alias'काम करता है।

आपके प्रश्न के लिए, ऐसा प्रतीत होता है कि आप इसे फ़ाइल को "सोर्सिंग" द्वारा परिधिबद्ध कर सकते हैं, उदा:

 bash -ci '. script.sh'

फिर उपनाम काम करते हैं। FWIW ...

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