कैसे एक उपनाम के लिए मापदंडों को पारित करने के लिए?


64

बैश स्क्रिप्ट के लिए, मैं "$@"तर्कों का उपयोग करने के लिए उपयोग कर सकता हूं । जब मैं एक उपनाम का उपयोग कर रहा हूँ तो क्या समान है?

जवाबों:


50

उपनाम इस तरह के आदेश हैं कि उनके लिए सभी तर्क उस कार्यक्रम के तर्क के रूप में पारित किए जाते हैं जो वे उर्फ ​​करते हैं। उदाहरण के लिए, यदि आप उर्फ ​​के lsलिए थे ls -la, तो टाइपिंग वास्तव में कमांड लाइन पर निष्पादित ls foo barहोगी ।ls -la foo bar

यदि आप चाहते हैं कि तर्कों की व्याख्या कैसे की जाए, तो आप वास्तविक नियंत्रण रख सकते हैं, तो आप इस तरह से एक फ़ंक्शन लिख सकते हैं:

my_program_wrapper() {
    local first_arg="$1" \
          second_arg="$2"

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/… कार्य में shपरिभाषित हैं my_program_wrapper() { ...; }। बैश कीवर्ड संभालता है functionलेकिन अधिक पोर्टेबल के साथ क्यों नहीं जाता है?
1

2
@ कुशल बहुत सच्चा। मेरा मतलब है कि इस तथ्य के अलावा कि हर कोई GNU बैश का उपयोग करता है न कि नंगे पोज़ के गोले का।
एम्फ़ैटेमाचिन

21

उपनाम समाधान

यदि आप वास्तव में प्रति से किसी फ़ंक्शन का उपयोग करने के खिलाफ हैं, तो आप उपयोग कर सकते हैं:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

आप बदल सकते हैं $@साथ $1ही आप केवल पहला तर्क चाहते हैं।

व्याख्या

यह एक अस्थायी फ़ंक्शन बनाता है f, जो तर्कों को पारित किया जाता है।

उपनाम के तर्क केवल अंत में पारित किए जाते हैं। ध्यान दें कि fउपनाम के बहुत अंत में कहा जाता है।

unset -fको हटा उपनाम के रूप में समारोह परिभाषा निष्पादित किया जाता है तो यह बाद में चारों ओर लटका नहीं करता है।


Humm? wrap_args x y zमुझे देता है: मार: अप्रत्याशित टोकन के पास वाक्यविन्यास त्रुटि `('
अण्डाकार दृश्य

@Elipticalview हम्म, कॉपी पेस्ट इश्यू? 4.4.12 को बैश पर काम करने की पुष्टि की।
टॉम हेल

1
मैंने fअलियास किया था । एक बार जब मैंने इसका उपयोग नहीं किया तो fयह ठीक काम करता है। पुराना नाम टक्कर की बात।
अण्डाकार दृश्य

command type f:)
टॉम हेल

1
महान! यह सबसे हल्का संस्करण है!
सर्जियस

19

वर्तमान उत्तरों को जोड़ते हुए, एक महत्वपूर्ण बात यह महसूस करने के बारे में है कि उपनाम कैसे काम करते हैं, जो कि एक अलियास कमांड के बाद आपके द्वारा लिखे गए सभी मापदंडों का शाब्दिक उपयोग किया जाएगा। तो दो आदेशों के लिए उर्फ ​​का उपयोग करने का कोई तरीका नहीं है (पाइप्ड या नहीं), जिसमें से पहले को मापदंडों की व्याख्या करनी चाहिए। इसे स्पष्ट करने के लिए, यहाँ कुछ ऐसी चीज़ों का उदाहरण दिया गया है जो उम्मीद के मुताबिक काम नहीं करेंगी:

alias lsswp="ls -l | grep swp"

( इस प्रश्न से प्रेरित एक उदाहरण ) यह हमेशा वर्तमान निर्देशिका ls -lमें किए गए आउटपुट का उपयोग करेगा और उस पर एक grep करेगा - इसलिए उपयोग करना

lsswp / tmp /

के बराबर होगा ls -l | grep swp /tmp/ और नहीं ls -l /tmp/ | grep swp

सभी उद्देश्यों के लिए जहां तर्कों को बीच में कहीं इस्तेमाल किया जाना चाहिए, किसी को functionइसके बजाय उपयोग करने की आवश्यकता है alias


15

आपको वास्तव में कुछ भी करने की ज़रूरत नहीं है; उपनाम अपने आप ऐसा करते हैं। उदाहरण के लिए:

$ alias less="less -eirqM"
$ less foo.txt

आप foo.txt का पहला पृष्ठ देखेंगे, और lessEOF (-ई) पर छोड़ देंगे, खोजें केस-असंवेदनशील (-आई) होंगी, आदि।


क्या आप कृपया मेरे प्रश्न को देख सकते हैं - कोई भी समाधान मेरे लिए काम नहीं करता है और मुझे एक इनाम शुरू करने की अनुमति नहीं है।
JJD

1
@JJD जिस व्यक्ति ने आपके प्रश्न का उत्तर दिया वह सही है: आप उस मामले में एक फ़ंक्शन चाहते हैं, एक उपनाम नहीं। चूँकि इस प्रश्न का स्वीकृत उत्तर मूल रूप से समान है, इसलिए आपका प्रश्न सही बंद था।
वॉरेन यंग

1

मैं csh के लिए जवाब दे रहा हूं:

हां, आप उपनामों में मापदंडों का उपयोग कर सकते हैं और - ऊपर बताए गए अंतर के रूप में - आप उन्हें उपनाम की परिभाषा में कहीं भी संदर्भित कर सकते हैं - न केवल अंत में।

उदाहरण के लिए कुछ-टार्ज़-गिंग:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

, कहां !:1और !:2क्या पैरामीटर हैं जो आप अपने उपनाम को कॉल करते समय आपूर्ति करेंगे।

उपयोग का उदाहरण:

    $ ls
    clrcf.dat                             user_comment_2016.06.03_12:51:50.txt  user_comment_2016.06.03_12:54:48.txt
        TEST-wADM.tec                         user_comment_2016.06.03_12:52:04.txt  user_comment_2016.06.03_12:55:13.txt


    $ tgz user* out
    a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K

    $ ls out*
    out.tar.gz

जिसका प्रभावी रूप से मतलब है कि आपने दो मापदंडों का उपयोग किया है जो आपने टार कमांड के मनमाने स्थानों पर डाला था, यह सभी का एक उपनाम है tgz

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