2012-01-11 16 views
60

मेरे पास एक स्क्रिप्ट है जिसमें कुछ फ़ंक्शन हैं।मैं कमांड लाइन में एक स्क्रिप्ट से फ़ंक्शन कैसे चला सकता हूं?

क्या मैं सीधे कमांड लाइन से फ़ंक्शन में से किसी एक को चला सकता हूं?

ऐसा कुछ?

myScript.sh func() 

उत्तर

30

स्क्रिप्ट केवल कार्यों को परिभाषित करता है और कुछ नहीं करता है, तो आपको पहले स्क्रिप्ट वर्तमान खोल source या . आदेश का उपयोग कर के संदर्भ में निष्पादित कर सकते हैं और फिर बस फ़ंक्शन को कॉल करें। अधिक जानकारी के लिए help source देखें।

+0

इस विधि के साथ एकमात्र समस्या यह है कि यदि आप अपने फ़ंक्शन में 'निकास' का उपयोग करते हैं, तो यह फ़ंक्शन निष्पादित होने के बाद टर्मिनल को बंद कर देगा। क्या इसके आसपास कोई रास्ता है? @SvenMarnach – user1527227

+0

@ user1527227: उस मामले में अगले उत्तर के साथ जाएं, आपको शेल स्क्रिप्ट का नियंत्रण दिया गया है। यदि आप नहीं करते हैं, तो आप पहले एक इंटरैक्टिव सबहेल कॉल कर सकते हैं (केवल 'bash' दर्ज करें), और' निकास 'केवल सबहेल को समाप्त कर देगा, लेकिन आपका टर्मिनल नहीं। –

15

निम्न आदेश पहले संदर्भ में समारोह पंजीकृत करता है, तो यह कहता है:

. ./myScript.sh && func() 
6

संक्षेप में, नहीं।

आप के साथ source (विवरण के लिए help source) है, जो तब आप उन्हें कॉल करने की अनुमति देगा अपने वातावरण में स्क्रिप्ट में सभी कार्यों के आयात कर सकते हैं। इसका स्क्रिप्ट निष्पादित करने का असर भी है, इसलिए ध्यान रखें।

शैल स्क्रिप्ट से फ़ंक्शन को कॉल करने का कोई तरीका नहीं है जैसे कि यह एक साझा लाइब्रेरी थी।

+0

मुझे लगता है कि इसे उचित उत्तर के रूप में अधिक वजन दिया जाना चाहिए। मैंने ओपी की इच्छा के समान कुछ करने की कोशिश की, लेकिन शेल स्क्रिप्टिंग को "क्लीन-कट, ओओपी डेवलपमेंट" (आईएमएचओ) के लिए इंजीनियर नहीं बनाया गया है। –

123

ठीक है, जबकि अन्य उत्तरों सही हैं - आप निश्चित रूप से कुछ और कर सकते हैं: यदि आपके पास बैश स्क्रिप्ट तक पहुंच है, तो आप इसे संशोधित कर सकते हैं, और अंत में विशेष पैरामीटर "[email protected]" - जो विस्तारित होगा आपके द्वारा निर्दिष्ट कमांड लाइन के तर्क, और चूंकि यह "अकेला" है, इसलिए खोल उन्हें क्रियापद कहने का प्रयास करेगा; और यहां आप फ़ंक्शन नाम को पहले तर्क के रूप में निर्दिष्ट कर सकते हैं। उदाहरण:

$ cat test.sh 
testA() { 
    echo "TEST A $1"; 
} 

testB() { 
    echo "TEST B $2"; 
} 

"[email protected]" 


$ bash test.sh 
$ bash test.sh testA 
TEST A 
$ bash test.sh testA arg1 arg2 
TEST A arg1 
$ bash test.sh testB arg1 arg2 
TEST B arg2 

पॉलिश के लिए, आप पहली बार सत्यापित कर सकते हैं कि आदेश मौजूद है और एक समारोह है:

# Check if the function exists (bash specific) 
if declare -f "$1" > /dev/null 
then 
    # call arguments verbatim 
    "[email protected]" 
else 
    # Show a helpful error 
    echo "'$1' is not a known function name" >&2 
    exit 1 
fi 
+12

ज्यादातर मामलों में '$ @" का उपयोग करें। कुछ मामलों में '$ @' सुरक्षित नहीं है। – fumiyas

0

संपादित करें: चेतावनी - इस सभी मामलों में काम नहीं करता है लगता है, लेकिन पर अच्छी तरह से काम कई सार्वजनिक लिपियों।

आप "नियंत्रण" नामक एक bash स्क्रिप्ट है और इसके अंदर आप एक समारोह में कहा जाता है "का निर्माण":

function build() { 
    ... 
} 

तो फिर तुम इसे इस तरह (निर्देशिका से वह कहाँ है) कॉल कर सकते हैं:

./control build 

यदि यह अन्य फ़ोल्डर के अंदर है, कि यह होगा:

another_folder/control build 

यदि आपकी फ़ाइल मैं "Control.sh" कहा जाता है, कि उसके अनुसार समारोह इस तरह प्रतिदेय बनाना होगा:

./control.sh build 
0

मैं एक स्थिति है जहाँ मैं bash स्क्रिप्ट से एक समारोह है (उदा से पहले निष्पादित नहीं किया जाना चाहिए की जरूरत है source द्वारा) और @$ के साथ समस्या यह है कि myScript.sh फिर दो बार चलाया जाता है, ऐसा लगता है ...इसलिए मैं एसईडी के साथ समारोह बाहर निकलने के लिए विचार के साथ आए हैं:

sed -n "/^func()/,/^}/p" myScript.sh

और बार मैं इसकी आवश्यकता पर यह निष्पादित करने के लिए, मैं इसे एक फाइल में डाल दिया और का उपयोग source:

sed -n "/^func()/,/^}/p" myScript.sh > func.sh; source func.sh; rm func.sh

संबंधित मुद्दे

 संबंधित मुद्दे