सवाल बैश: उपनाम नाम में रिक्त स्थान


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

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

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

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


98
2018-02-05 22:35


मूल


क्यों नहीं alias lsm='ls -la | more' - Nifle


जवाब:


बैश दस्तावेज राज्यों "लगभग हर उद्देश्य के लिए, उपनामों पर खोल कार्यों को प्राथमिकता दी जाती है।" यहां एक शेल फ़ंक्शन है जो प्रतिस्थापित करता है 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

104
2018-02-05 23:13



यदि आपको कथन के अंदर डबल ब्रैकेट का उपयोग करने की आवश्यकता क्यों है? - sixtyfootersdude
@sixtyfootersdude: डबल-ब्रैकेट फॉर्म अधिक शक्तिशाली है और मैं इसे आदत से उपयोग करता हूं। देख mywiki.wooledge.org/BashFAQ/031 - Dennis Williamson
तो अंतिम आदेश क्या है? ऊर्फ एलएस = 'एलएस ()' ?? - Jeef
@ जीईएफ: नहीं, मेरा जवाब एक समारोह का उपयोग करता है बजाय उपनाम के। मैंने इसे स्पष्ट करने की कोशिश करने के लिए इसे संपादित किया है। - Dennis Williamson
@merlinpatt: command कार्य को पुनरावर्ती रूप से बुलाए जाने से रोकता है। - Dennis Williamson


वहाँ से उपनाम आदमी पेज:

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

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


45
2018-02-05 22:47



+1 यह बताने के लिए कि मुझे ls -la को उपनाम के रूप में उपयोग करने की अनुमति क्यों नहीं है। - sixtyfootersdude
यह सहायक था क्योंकि इसे हल करने की कोशिश करने के बजाय उसने सवाल का जवाब दिया। मैं यहाँ आया क्योंकि मैं इसमें एक जगह के साथ एक उपनाम बनाना चाहता था और यह नहीं होगा। - angryundead


डेनिस के जवाब से थोड़ा बेहतर दृष्टिकोण लिया गया:

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


13
2017-09-26 12:42



अगर मैं चाहता हूं तो यह कैसे संभालता है ls -lat इस उपचार से बाहर रखा जाना है? मुझे इसे ऊपर से संभालने के लिए एक मामला डालना होगा -la* प्रवेश, हाँ? - Steven Lu


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


-2
2018-02-05 23:34