क्या मैं अन्य उपनाम के लिए तर्क पारित कर सकता हूं?


19

मैं जानना चाहता हूं कि क्या मैं अन्य उपनाम के साथ तर्क पारित कर सकता हूं।

उदाहरण के लिए:

alias d="dmesg|grep -iw usb|tail -5" 

अब dअंतिम 5 लाइनों को प्रिंट करेगा। यदि मैं अलग-अलग संख्याओं वाली लाइनों को प्रिंट करने के लिए d का उपयोग करना चाहता हूं, तो मुझे dफिर से उपनाम की घोषणा में बदलाव करना होगा।

क्या कोई ऐसा तरीका है जिससे मैं एक उपनाम की घोषणा को संशोधित कर सकता हूं ताकि मुझे लाइनों की संख्या को बदलने के लिए घोषणा को वापस न लेना पड़े। जैसे उर्फ ​​घोषित करते समय एक तर्क के रूप में लाइनों की संख्या को पारित करना शामिल है d? या इसे हल करने के लिए कोई और तरीका है?


में (t) csh, "\! *" एक अलियास के लिए तर्कों का संदर्भ देता है (बैकस्लैश केवल विस्मयादिबोधक चिह्न से बचने के लिए है जिसका सामान्य रूप से "इतिहास" होता है), और आप व्यक्तिगत तर्कों का संदर्भ भी दे सकते हैं, हालांकि मुझे याद नहीं है कि कैसे। तो शायद "पूँछ -n \! *" या कुछ और (मुझे नहीं लगता कि! * इसके पहले तुरंत माइनस साइन के साथ काम करेंगे)। हालांकि, यकीन नहीं है कि यह (बा) श में काम करेगा।
बैरीकेटर

जवाबों:


20

उपनाम तर्क नहीं लेते हैं। जैसे उपनाम के साथ alias foo='bar $1', $1शेल द्वारा शेल के पहले तर्क में विस्तार किया जाएगा (जो कि संभावना नहीं है) जब उपनाम चलाया जाता है।

इसलिए: इसके बजाय कार्यों का उपयोग करें

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} यदि यह प्रदान नहीं किया जाता है, तो 5 के डिफ़ॉल्ट मान के साथ पहले तर्क का उपयोग करता है।

तो आप कर सकते हैं:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

या, यदि आप उन विकल्पों को बदलते हैं जिनका आपने थोड़ा उपयोग किया है:

alias d="dmesg|grep -iw usb|tail -n 5"

फिर आप अतिरिक्त -nविकल्प पास कर सकते हैं:

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

यदि कई -nविकल्पों के लिए निर्दिष्ट किया जाता है tail, तो केवल अंतिम का उपयोग किया जाता है।


कार्यात्मक अपने आप की तरह चुनौती दी लिए :) यह जहां समारोह ... यानी डाल करने के लिए कुछ समय के लिए राज्य के लिए उपयोगी हो सकता है ~/.bashrcया rc.localया जहाँ भी?
WinEunuuchs2Unix

@ WinEunuuchs2Unix जहाँ भी उपनाम रखा गया होता।
मूरू

5

आपको इसके लिए एक फ़ंक्शन होना चाहिए जैसा कि एसओ और यहाँ वर्णित है । निम्नलिखित आज़माएँ:

foo() { /path/to/command "$@" ;}

और इसके fooसाथ कॉल करें :

foo arg1 arg2 arg3

4

समूह कमांड और यहां-स्ट्रिंग के साथ अन्य सीमाओं के आसपास काम करना

उपनाम तर्क नहीं ले सकते, लेकिन हम "अनुकरण" कर सकते हैं। उदाहरण के लिए इस प्रश्न पर मेरे उत्तर का उदाहरण लें ।

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

मुख्य बिंदु जो यहां हो रहे हैं:

  • हम readएक स्ट्रिंग को एक चर में पढ़ने के लिए निर्मित में उपयोग करते हैं d। चूँकि हम रिक्त वर्णों (न्यूलाइन, टैब्स, स्पेस) सहित एक पूर्ण स्ट्रिंग को पढ़ना चाहते हैं, हम IFS=बैकस्लैश से बचकर वापस उपयोग और अक्षम करते हैं -r
  • <<<यहाँ यह है कि स्ट्रिंग-संचालक हमें जो भी स्ट्रिंग प्रदान करने की अनुमति देता है वह mkcdउर्फ तर्क के रूप में प्रदान करता है ; उपयोग के रूप में होगाmkcd "some directory"
  • उपनाम के भीतर कई आदेशों को { list; }संरचना का उपयोग करके वर्तमान शेल में संयोजित और निष्पादित किया जाता है (जिसे मैनुअल के रूप group commandमें जाना जाता है bash)। ध्यान दें कि कमांड के बाद {और ;व्यक्तिगत सूची के लिए प्रमुख स्थान आवश्यक है।

आपके विशिष्ट उदाहरण में हम कर सकते हैं:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

हम अंतरिक्ष-पृथक तर्कों को संग्रहीत करने के लिए शब्द विभाजन का उपयोग भी कर सकते हैं:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

या हम कई तर्क देने के लिए सरणियों का उपयोग कर सकते हैं:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

लेकिन क्या यह अच्छा तरीका है?

जरुरी नहीं। इस तरह के दृष्टिकोण के साथ समस्या यह है कि यह बहुत विशिष्ट है - तर्कों को आसानी से उद्धृत नहीं किया जा सकता है जिसका अर्थ है कि हमारे पास केवल रिक्त स्थान नहीं होने के तर्क हैं।

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

यह निश्चित रूप से ऐसा कुछ नहीं है जिसका व्यापक रूप से उपयोग किया जाएगा, केवल इसलिए कि वास्तविक दुनिया में हमें जटिल तर्कों से निपटना है, इसलिए यह दृष्टिकोण अधिक व्यावहारिक नहीं है। कार्य कहीं अधिक लचीले हैं। और आर्ग्स स्ट्रिंग को कोट करने की आवश्यकता तेजी से कष्टप्रद हो जाती है।

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

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