शेल एलियास को कमांड लाइन तर्क कैसे पास करें?


288

मैं कमांड लाइन आर्ग्युमेंट्स को अन्य उपनाम से कैसे पास करूं? यहाँ एक नमूना है:

उपनाम mkcd = 'mkdir $ 1; सीडी $ 1? '

लेकिन इस मामले में $ xx का निर्माण समय पर नहीं बल्कि उपनाम बनाने में किया जा रहा है। फिर भी, मैंने नीचे की तरह एक शेल फ़ंक्शन (थोड़ा गुग्लिंग के बाद) का उपयोग करके एक वर्कअराउंड बनाया है:

फ़ंक्शन mkcd () {
  mkdir $ 1
  सीडी $ 1
}

बस जानना चाहता था कि क्या एलियास बनाने का एक तरीका है जो सीएल मापदंडों को स्वीकार करता है।
BTW - मैं अपने डिफ़ॉल्ट शेल के रूप में 'बैश' का उपयोग करता हूं।



2
हे / टी लेकिन के बारे में mkcd समारोह कर के लिए एक विकल्प के रूप में, आप लिख सकते हैंmkdir mydirectoryname && cd $_
मोआला

जवाबों:


174

आपको रास्ता मिल गया: एक उपनाम के बजाय एक फ़ंक्शन बनाएं। सी शेल में उपनामों के लिए तर्क करने के लिए एक तंत्र है, लेकिन बैश और कॉर्न शेल नहीं है, क्योंकि फ़ंक्शन तंत्र अधिक लचीला है और एक ही क्षमता प्रदान करता है।


हालाँकि आपको .bashrcफ़ाइल में उपनाम बनाते समय कार्यों की आवश्यकता नहीं है । उदाहरण के लिए # उपयोगकर्ता के नाम से पोर्ट-नंबर लेने वाला एक उपनाम बनाएं = "python -m SimpleHTTPServer $ 1" .bashrc फ़ाइल में परिवर्तन करने के बाद, सुनिश्चित करें कि आप निम्न कमांड दर्ज करते हैं। ~ $ source .bashrc आप इसे इस तरह उपयोग कर सकते हैं ~ $ 8998 परोसें
kaizer1v

8
@ kaizer1v, CentOS7.3 बैश संस्करण ४.२.४६ पर मेरा अवलोकन यह है कि आपका सुझाव वैसा काम नहीं करता जैसा आप सोचते हैं कि यह करता है। क्योंकि आप दोहरे उद्धरण चिह्नों का उपयोग कर रहे हैं $ 1 का वास्तव में एक खाली स्ट्रिंग का मूल्यांकन किया जा रहा है और उपनाम वास्तव में उर्फ ​​सर्व = "अजगर-एम सिंपलएचटीपीएससेवर" के समान है और इसलिए आप उस उपनाम के बाद जो भी पास करते हैं वह उपनाम रेखा पर पारित हो जाता है। यदि आप इस सेट -x का प्रयास करते हैं; उपनाम सेवा = "अजगर -m SimpleHTTPServer $ 1 &" आपको त्रुटि / समस्या दिखाई देगी। आपके तर्क और उपनाम आदेश दोनों को अलग-अलग कमांड के रूप में चलाया जाता है।
पाट्स

279

अन्य कार्यों के लिए जो पोस्ट किया गया है, उसे दोहराने के लिए, बाश में निम्नलिखित कार्य करें:

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

निम्नलिखित चल रहा है:

blah one two

नीचे उत्पादन देता है:

First: one
Second: two

4
महान समाधान। एक बैश नौसिखिया से कुछ सवाल: क्या फ़ंक्शन को अंडरस्कोर (या बिल्कुल अलग) के साथ नामित करना होगा या यह सिर्फ पठनीयता के लिए है? फ़ंक्शन को परिभाषित करने में अनुगामी "_blah" का उद्देश्य क्या है? एकल उद्धरणों के स्थान पर दोहरे उद्धरण चिह्नों का उपयोग करते समय यह क्यों काम नहीं करता है ($ 1 को सही ढंग से व्याख्या नहीं किया गया है) यहां तक ​​कि कुछ ऐसा करने के लिए, जिसमें $ 1 के आसपास उद्धरणों की आवश्यकता नहीं है? सलाह के लिए अग्रिम धन्यवाद। मेरे पास एक कार्यशील समाधान है लेकिन हमेशा यह समझने के लिए पसंद है कि यह क्यों काम करता है।
mynameispaulie

4
@mynameispaulie फ़ंक्शन को कुछ भी नाम दिया जा सकता है। मैंने एक अंडरस्कोर उपसर्ग का उपयोग किया है क्योंकि यह नाम की टक्करों को रोकने में मदद करने के लिए एक आम चाल है (अर्थात इसी नाम के साथ एक और कार्य)
थॉमस ब्राट

6
@mynameispaulie दोहरे उद्धरण चिह्नों की अनुमति देने Bashको बदलने के लिए $1और $2मानकों को कार्य करने के लिए पारित कर दिया है। सिंगल कोट्स ने बैश को ऐसा नहीं करने के लिए कहा।
थॉमस ब्रैट

5
मैं इस उपनाम / फ़ंक्शन कॉम्बो कॉपी / पेस्ट को बहुत देखता हूं, लेकिन यह किसी उपयोगी उद्देश्य की पूर्ति नहीं करता है। मानक दृष्टिकोण एक बार फ़ंक्शन को परिभाषित करने के लिए होगा, एक संत नाम के साथ, और एक उपनाम नहीं है।
ट्रिपल

16
मैं यह देखने में विफल हूं कि यह कैसे पसंद किया जाता हैfunction blah(){ echo "First: $1"; echo "Second: $2"; }
रेने न्यफेनेगर

57

आप ksh में नहीं, लेकिन आप csh में कर सकते हैं।

alias mkcd 'mkdir \!^; cd \!^1'

Ksh में, फंक्शन जाने का तरीका है। लेकिन अगर आप वास्तव में उपनाम का उपयोग करना चाहते हैं:

alias mkcd='_(){ mkdir $1; cd $1; }; _'

एक दिलचस्प पक्ष के रूप में, मुझे लगता है कि दूरस्थ कोड निष्पादन भेद्यता जिसके बारे में हर कोई हाल ही में बात कर रहा है, लगभग यही काम कर रहा है, लेकिन कच्चे उपयोगकर्ता इनपुट द्वारा सेट किए जा रहे पर्यावरण चर में। openwall.com/lists/oss-security/2014/09/24/11
Floegipoky

@Floegipoky - क्योंकि यह एक उपनाम में है और एक env var नहीं है, इसकी काफी भिन्नता है। शेलशॉक की समस्या यह है कि यह तब चलता है जब env var सेट होता है। Env var सेट करना एक सुरक्षित ऑपरेशन माना जाता है। उपरोक्त एलियास सेट होने पर कोई स्क्रिप्ट निष्पादित नहीं होती है, केवल जब अन्य उपनाम चलाया जाता है।
संजय आर।

शायद यह इंगित किया जाना चाहिए कि cshआमतौर पर वह नहीं है जो एक आधुनिक व्यक्ति को उपयोग करना चाहिए। अलियास-जो-ए-फ़ंक्शन-तब-ए-एक्ज़िक्यूट्स-द-फंक्शन-इनडायरेक्ट अप्रत्यक्ष रूप से लोकप्रिय है, लेकिन एक उचित कार्य पर कोई लाभ नहीं प्रदान करता है, जहां तक ​​मैं बता सकता हूं। (फ़ंक्शन को ठीक से, वैसे भी अपने तर्क को उद्धृत करना चाहिए।) डाउनवोटिंग।
ट्रिपल

17

बैश मैन पेज को उद्धृत करने के लिए:

प्रतिस्थापन पाठ में तर्कों का उपयोग करने के लिए कोई तंत्र नहीं है। यदि तर्कों की आवश्यकता होती है, तो एक शेल फ़ंक्शन का उपयोग किया जाना चाहिए (नीचे फ़ंक्शंस देखें)।

तो ऐसा लगता है कि आपने अपने प्रश्न का उत्तर दिया है - एक उपनाम के बजाय एक फ़ंक्शन का उपयोग करें


12

आपको यह कमांड उपयोगी भी लग सकती है:

mkdir dirname && cd $_

जहाँ dirname उस निर्देशिका का नाम है जिसे आप बनाना चाहते हैं


1
@StarDust $_अंतिम कमांड unix.stackexchange.com/a/271693/169772
टेलर

5

मैंने पाया कि फ़ंक्शन ~/.cshrcफ़ाइल में नहीं लिखे जा सकते । यहाँ उर्फ ​​में जो तर्क लेता है

उदाहरण के लिए, 'आदेश' खोजने के लिए तर्क दिए गए

alias fl "find . -name '\!:1'"     
Ex: >fl abc

जहाँ abc तर्क के रूप में पारित किया गया है!: 1


4
यह ओपी के लिए उपयोगी नहीं है, जिसका डिफ़ॉल्ट शेल बैश है। और संजय आर के जवाब ने 4 साल पहले csh उपनाम का उल्लेख किया था।
कीथ थॉम्पसन

1
संजय आर के जवाब की व्याख्या नहीं की गई थी !:1। मुझे यह देखने के लिए नीचे स्क्रॉल करना पड़ा कि यह तर्क था। एक अच्छा जवाब अधिक प्रश्न नहीं छोड़ता है, भले ही वह ओपी शेल प्रकार के लिए न हो।
searchengine27

4

सबसे आसान तरीका है, फ़ंक्शन का उपयोग नहीं उपनाम। आप अभी भी किसी भी समय क्ली से फंक्शन कह सकते हैं। बाश में, आप केवल फ़ंक्शन नाम () {कमांड} जोड़ सकते हैं यह एक उपनाम के समान लोड करता है।

function mkcd() { mkdir $1; cd $1 ;}

अन्य गोले के बारे में निश्चित नहीं है


2

आप वास्तव में बैश उपनामों के साथ जो चाहते हैं वह नहीं कर सकते, क्योंकि उपनाम स्थिर हैं। इसके बजाय, आपके द्वारा बनाए गए फ़ंक्शन का उपयोग करें।

अधिक जानकारी के लिए यहां देखें: http://www.mactips.org/archives/2008/01/01/increase-productivity-with-bash-aliases-and-functions/ । (हां मुझे पता है कि यह mactips.org है, लेकिन यह बैश के बारे में है, इसलिए चिंता न करें।)


1

यह ksh में काम करता है:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

"-X" विकल्प उपनाम "निर्यात" करता है - उपनाम उप-भागों में दिखाई देता है।

और इस तथ्य से अवगत रहें कि किसी स्क्रिप्ट में परिभाषित उपनाम उस स्क्रिप्ट में दिखाई नहीं देते हैं (क्योंकि किसी स्क्रिप्ट को लोड किए जाने पर उपनाम का विस्तार किया जाता है, न कि जब किसी पंक्ति की व्याख्या की जाती है)। इसे उसी शेल में एक अन्य स्क्रिप्ट फ़ाइल को निष्पादित करने (डॉट का उपयोग करके) के साथ हल किया जा सकता है।



-2

यहां अजगर का उपयोग करके एक सरल उदाहरण फ़ंक्शन है। आप ~ / .bashrc में चिपके रह सकते हैं
। पहले बाएं बाएँ घुंघराले ब्रैकेट के बाद आपके पास एक जगह
होगी। चर प्रतिस्थापन के लिए पायथन कमांड को दोहरे उद्धरण चिह्नों में होना चाहिए
जो अंत में अर्धविराम को न भूलें।

फंक्शन काउंट () {python -c "in num के लिए xrange ($ 1): प्रिंट संख्या";};

$ count 6
0
1
2
3
4
5
$

-5

एक खाली उर्फ ​​अपने काम को अंजाम देगा:

alias DEBUG=

12
मैं आपके प्रतिनिधि द्वारा देखता हूं कि आप SO (Stack Overflow) में नए हैं। कृपया अपने उत्तर के मतदान से निराश न हों। इसे नीचे वोट दिया गया है क्योंकि यह वास्तव में उस प्रश्न का उत्तर नहीं देता है जो ओपी (मूल पोस्टर) ने उत्तर देने के लिए कहा था। उनके अंदर झूलते रहो और कोशिश करते रहो। जवाब देते समय, यह भी एक सरल उदाहरण शामिल करने का प्रयास करें कि आपका उत्तर कैसे काम करता है और आउटपुट दिखाता है। इससे दूसरों को यह देखने में मदद मिलेगी कि आपका उत्तर कैसे काम करता है।
पाट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.