बैश: उपनाम में नाम


116

मैं बैश में एक उपनाम बनाने की कोशिश कर रहा हूं। मैं जो करना चाहता हूं, उसका नक्शा ls -laकरना हैls -la | more

मेरी .bashrc फ़ाइल में यह वही है जो मैंने प्रयास किया:

alias 'ls -la'='ls -la | more'

हालाँकि यह काम नहीं करता क्योंकि (मुझे लगता है) यह उपनाम नाम में रिक्त स्थान है। क्या इसके आसपास कोई कार्य है?


8
क्यों न करेंalias lsm='ls -la | more'
निफ़ल

जवाबों:


125

बैश प्रलेखन राज्यों "लगभग हर प्रयोजन के लिए, खोल कार्यों उपनाम से अधिक पसंद कर रहे हैं।" यहां एक शेल फ़ंक्शन है जो तर्क (यदि केवल) से युक्त है, तो lsआउटपुट को प्रतिस्थापित करता है और पाइप करने का कारण बनता है ।more-la

ls() {
    if [[ $@ == "-la" ]]; then
        command ls -la | more
    else
        command ls "$@"
    fi
}

एक-लाइनर के रूप में:

ls() { if [[ $@ == "-la" ]]; then command ls -la | more; else command ls "$@"; fi; }

स्वचालित रूप से पाइप उत्पादन:

ls -la

1
आपको if स्टेटमेंट के अंदर डबल ब्रैकेट का उपयोग करने की आवश्यकता क्यों है?
साठफुटेर्सडूड

1
@sixtyfootersdude: डबल-ब्रैकेट फ़ॉर्म अधिक शक्तिशाली है और मैं इसे आदत से उपयोग करता हूं। देखें mywiki.wooledge.org/BashFAQ/031
डेनिस विलियमसन

तो अंतिम आदेश क्या है? उर्फ एलएस = 'एलएस ()' ??
जीफ

1
@ जीफ़: नहीं, मेरा जवाब एक उपनाम के बजाय एक फ़ंक्शन का उपयोग करता है । मैंने इसे स्पष्ट करने की कोशिश करने के लिए इसे संपादित किया है।
डेनिस विलियमसन

6
@merlinpatt: commandफ़ंक्शन को पुनरावर्ती कहने से रोकता है।
डेनिस विलियम्सन

53

से उर्फ आदमी पेज :

प्रत्येक साधारण कमांड का पहला शब्द, यदि अयोग्य है, तो यह देखने के लिए जाँच की जाती है कि क्या यह एक उपनाम है। यदि हां, तो उस शब्द को उपनाम के पाठ से बदल दिया जाता है। उपनाम नाम और प्रतिस्थापन पाठ में शेल मेटाचैकर सहित कोई भी मान्य शेल इनपुट शामिल हो सकता है, अपवाद के साथ कि उपनाम नाम में '=' ​​नहीं हो सकता है।

तो, केवल पहले शब्द को उर्फ ​​मैचों के लिए जांचा जाता है जो बहु-शब्द उपनामों को असंभव बनाता है। आप एक शेल स्क्रिप्ट लिखने में सक्षम हो सकते हैं जो तर्कों की जांच करता है और आपके आदेश को कॉल करता है यदि वे मेल खाते हैं और अन्यथा बस सामान्य कहते हैं ls(देखें @ डेनिस विलियमसन का उत्तर )


8
+1 यह समझाने के लिए कि मुझे एलएस-एल को उर्फ ​​के रूप में उपयोग करने की अनुमति क्यों नहीं है।
साठफुटेरसूड

7
यह मददगार था क्योंकि इसे सुलझाने की कोशिश के बजाय इसने सवाल का जवाब दिया। मैं यहाँ आया क्योंकि मैं इसमें एक जगह के साथ एक उपनाम बनाना चाहता था और यह अभी नहीं होगा।
गुस्‍से में

इसने न केवल मेरे प्रश्न का उत्तर दिया, बल्कि मुझे इस बात की बहुमूल्य जानकारी दी कि अलियासिंग तंत्र वास्तव में कैसे काम करता है। मैन पेज से आपका उद्धरण काफी मददगार था।
लिली फिनाले

14

डेनिस के उत्तर से लिया गया थोड़ा सुधरा हुआ दृष्टिकोण:

function ls() {
  case $* in
    -la* ) shift 1; command ls -la "$@" | more ;;
    * ) command ls "$@" ;;
  esac
}

या वन-लाइनर:

function ls() { case $* in -la* ) shift 1; command ls -la "$@" | more ;; * ) command ls "$@" ;; esac }

यह उदाहरण के लिए, यदि आवश्यक हो तो आदेश के बाद आगे के विकल्प / तर्कों को संलग्न करने की अनुमति देता है ls -la -h


2
यदि मैं ls -latइस उपचार से बाहर होना चाहता हूं तो यह कैसे संभालता है ? मुझे -la*प्रविष्टि के ऊपर इसे संभालने के लिए एक मामला डालने की आवश्यकता होगी , हाँ?
स्टीवन लू

-1

आप इस उपनाम को अभी भी लागू कर सकते हैं, लेकिन आपको आदेश में उद्धरण की आवश्यकता है कि अंतरिक्ष कमांड शब्द का हिस्सा है। तो विकल्प को "ls -la" -p patternपास करेगा , नहीं ।-p patternmorels

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