बश कार्यों को कैसे कॉल करें


28

शायद मैं इसे गलत तरीके से देख रहा हूं .. लेकिन यहां मैं वह कर रहा हूं जो मैं करने की कोशिश कर रहा हूं। मेरे ज्यादातर काम जावा के साथ करते हैं लेकिन सिर्फ यूनिक्स (बैश) के माहौल में बदल जाते हैं। मैं यह कर रहा हूँ:

[~/Desktop/bashPlay]% cat myFunc
#!/bin/bash

ls2(){
        echo "Hello World"
}

ls3(){
        echo "Testing"
}

echo "this is a test"   
ls2 # this calls a function

[~/Desktop/bashPlay]% myFunc
this is a test
Hello World

लेकिन मेरी फ़ाइल में दो कार्य हैं और मैं उन्हें कमांड लाइन से अलग से कॉल करने में सक्षम होना चाहता हूं। Ie: myFunc.ls2()या बस भी ls2। मुझे पता है कि मैं अपनी .bashrcफ़ाइल में फ़ंक्शंस जोड़ सकता हूं लेकिन क्या कोई और तरीका है कि मैं इन फ़ंक्शंस को अपने साथ जोड़े बिना निष्पादित कर सकता हूं .bashrc?

जवाबों:


25

ऐसा करने का एक तरीका, जिसमें थोड़ा अधिक टाइपिंग शामिल है, sourceकमांड के माध्यम से है । MyFunc से एक फ़ंक्शन को कॉल करने के लिए आप उपयोग कर सकते हैं source myFunc; ls2और यह हैलो वर्ल्ड आउटपुट करेगा।

इसलिए उदाहरण के लिए, मेरे पास एक फाइल है say.sh:

#!/bin/bash

function talk()
{
        echo "hi!"
}

अब मैं इसे talk()कमांड लाइन से कार्य करना चाहता हूं :

[जॉन @ भयानक ~] $ source say.sh; बातचीत
नमस्ते!

इसे किसी अन्य बैश स्क्रिप्ट से कॉल करने के लिए:

#!/bin/bash
source say.sh
talk

आप प्रत्येक को एक अलग स्क्रिप्ट में भी रख सकते हैं और उन्हें एक निर्देशिका में जोड़ सकते हैं जो आपके पैट चर में है।

उदाहरण के लिए, एक स्क्रिप्ट में जिसे helloआप कहते हैं:

#!/bin/bash
echo "Hello World"

अब इसे अपने पथ में निर्देशिका में से एक में रखें, जिसे आप चलाकर देख सकते हैं echo $PATH। यदि आप चाहें या किसी मौजूदा का उपयोग कर सकते हैं, तो आप अपने पैट में एक और निर्देशिका जोड़ सकते हैं। एक बार जब आप फ़ाइल को वहां कॉपी कर लेते हैं, तो इसे निष्पादन योग्य बना देते हैं chmod +x filename


3
बस स्पष्ट होने के लिए: आपको केवल स्क्रिप्ट या शेल स्टार्टअप के अनुसार फ़ाइल को एक बार स्रोत करना होगा। आप फ़ंक्शन को जितनी बार चाहें उतनी बार कॉल कर सकते हैं, उसके बाद खट्टी फ़ाइल को फिर से संदर्भित किए बिना।
अगली सूचना तक रोक दिया गया।

5

एक अन्य दृष्टिकोण एक स्क्रिप्ट बनाने के लिए होगा functions.sh( ~/binउदाहरण के लिए निर्देशिका में)।

इस स्क्रिप्ट में, आप अपनी सभी व्यक्तिगत फ़ंक्शन परिभाषाएँ जोड़ते हैं (हर बार जब आप किसी फ़ंक्शन को इस फ़ाइल में जोड़ते हैं तो कहते हैं ...)

अंत में आपको बस source ~/bin/functions.shअपनी .bashrcफाइल में लाइन जोड़ना है । इस तरह से आप उन्हें कमांड लाइन से कॉल कर पाएंगे, आपका .bashrcघर साफ रहेगा, और आपके व्यक्तिगत कार्यों के लिए एक विशिष्ट स्थान होगा।


5

यदि आप मेरे जैसे हैं, तो आप अपने वातावरण को कार्यों के साथ अव्यवस्थित नहीं करना चाहते हैं। आपके पास फ़ंक्शन का एक समूह है जो वे क्या करते हैं के संदर्भ में एक साथ हैं, इसलिए उन्हें एक ही स्क्रिप्ट फ़ाइल में रखना समझ में आता है। (मुझे पता है कि एक से अधिक फ़ाइलों वाला फ़ोल्डर एक ही उद्देश्य को पूरा कर सकता है)। यहां एक संभावित समाधान है जो आपको स्क्रिप्ट में एक विशिष्ट फ़ंक्शन को कॉल करने की अनुमति देता है:

$ cat functions.sh    
#!/bin/bash

ls2() {
        echo "Hello World"
}

ls3() {
        echo "Testing $*"
}

# the next line calls the function passed as the first parameter to the script.
# the remaining script arguments can be passed to this function.

$1 $2 $3 $4 $5 

$ ./functions.sh ls2    
Hello World   
$ ./functions.sh ls3    
Testing     
$ ./functions.sh ls3 first_arg    
Testing first_arg    
$

मुझे यह बहुत पसंद है sourceक्योंकि यह एक ही नाम के दो कार्यों को दो अलग-अलग sh फ़ाइलों में संभाल सकता है। मैं की जगह मापदंडों के एक मनमाना संख्या को संभालने के लिए यह परिष्कृत $1 $2 $3 $4 $5साथFUNC_CALL=$1; shift; $FUNC_CALL "$@"
चक विल्बर

@ChuckWilbur: हुप्स के माध्यम से क्यों कूदें? बस अंतिम पंक्ति को बदल दें "$@"। PS आपका दृष्टिकोण वास्तव में गलत है; अंतिम भाग होना चाहिए "$FUNC_CALL" "$@"  (यानी,  $FUNC_CALLउद्धरणों में होना चाहिए)।
स्कॉट

क्या है "$FUNC_CALL"?
ctrl-alt-delor

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