मेरे पास एक स्क्रिप्ट है जिसमें कुछ फ़ंक्शन हैं।मैं कमांड लाइन में एक स्क्रिप्ट से फ़ंक्शन कैसे चला सकता हूं?
क्या मैं सीधे कमांड लाइन से फ़ंक्शन में से किसी एक को चला सकता हूं?
ऐसा कुछ?
myScript.sh func()
मेरे पास एक स्क्रिप्ट है जिसमें कुछ फ़ंक्शन हैं।मैं कमांड लाइन में एक स्क्रिप्ट से फ़ंक्शन कैसे चला सकता हूं?
क्या मैं सीधे कमांड लाइन से फ़ंक्शन में से किसी एक को चला सकता हूं?
ऐसा कुछ?
myScript.sh func()
स्क्रिप्ट केवल कार्यों को परिभाषित करता है और कुछ नहीं करता है, तो आपको पहले स्क्रिप्ट वर्तमान खोल source
या .
आदेश का उपयोग कर के संदर्भ में निष्पादित कर सकते हैं और फिर बस फ़ंक्शन को कॉल करें। अधिक जानकारी के लिए help source
देखें।
निम्न आदेश पहले संदर्भ में समारोह पंजीकृत करता है, तो यह कहता है:
. ./myScript.sh && func()
संक्षेप में, नहीं।
आप के साथ source
(विवरण के लिए help source
) है, जो तब आप उन्हें कॉल करने की अनुमति देगा अपने वातावरण में स्क्रिप्ट में सभी कार्यों के आयात कर सकते हैं। इसका स्क्रिप्ट निष्पादित करने का असर भी है, इसलिए ध्यान रखें।
शैल स्क्रिप्ट से फ़ंक्शन को कॉल करने का कोई तरीका नहीं है जैसे कि यह एक साझा लाइब्रेरी थी।
मुझे लगता है कि इसे उचित उत्तर के रूप में अधिक वजन दिया जाना चाहिए। मैंने ओपी की इच्छा के समान कुछ करने की कोशिश की, लेकिन शेल स्क्रिप्टिंग को "क्लीन-कट, ओओपी डेवलपमेंट" (आईएमएचओ) के लिए इंजीनियर नहीं बनाया गया है। –
ठीक है, जबकि अन्य उत्तरों सही हैं - आप निश्चित रूप से कुछ और कर सकते हैं: यदि आपके पास बैश स्क्रिप्ट तक पहुंच है, तो आप इसे संशोधित कर सकते हैं, और अंत में विशेष पैरामीटर "[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
ज्यादातर मामलों में '$ @" का उपयोग करें। कुछ मामलों में '$ @' सुरक्षित नहीं है। – fumiyas
संपादित करें: चेतावनी - इस सभी मामलों में काम नहीं करता है लगता है, लेकिन पर अच्छी तरह से काम कई सार्वजनिक लिपियों।
आप "नियंत्रण" नामक एक bash स्क्रिप्ट है और इसके अंदर आप एक समारोह में कहा जाता है "का निर्माण":
function build() {
...
}
तो फिर तुम इसे इस तरह (निर्देशिका से वह कहाँ है) कॉल कर सकते हैं:
./control build
यदि यह अन्य फ़ोल्डर के अंदर है, कि यह होगा:
another_folder/control build
यदि आपकी फ़ाइल मैं "Control.sh" कहा जाता है, कि उसके अनुसार समारोह इस तरह प्रतिदेय बनाना होगा:
./control.sh build
मैं एक स्थिति है जहाँ मैं 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
इस विधि के साथ एकमात्र समस्या यह है कि यदि आप अपने फ़ंक्शन में 'निकास' का उपयोग करते हैं, तो यह फ़ंक्शन निष्पादित होने के बाद टर्मिनल को बंद कर देगा। क्या इसके आसपास कोई रास्ता है? @SvenMarnach – user1527227
@ user1527227: उस मामले में अगले उत्तर के साथ जाएं, आपको शेल स्क्रिप्ट का नियंत्रण दिया गया है। यदि आप नहीं करते हैं, तो आप पहले एक इंटरैक्टिव सबहेल कॉल कर सकते हैं (केवल 'bash' दर्ज करें), और' निकास 'केवल सबहेल को समाप्त कर देगा, लेकिन आपका टर्मिनल नहीं। –