जवाबों:
जैसे दूसरों ने कहा है, आप ऐसा नहीं कर सकते।
लेकिन अगर आप कोड को एक फ़ाइल में व्यवस्थित करना चाहते हैं ताकि मुख्य कार्यक्रम फ़ाइल के शीर्ष पर हो, और अन्य फ़ंक्शन नीचे परिभाषित किए गए हैं, तो आप इसे एक अलग main
फ़ंक्शन करके कर सकते हैं ।
उदाहरण के लिए
#!/bin/sh
main() {
if [ "$1" = yes ]; then
do_task_this
else
do_task_that
fi
}
do_task_this() {
...
}
do_task_that() {
...
}
main "$@"; exit
जब हम main
फ़ाइल के अंत में कॉल करते हैं, तो सभी फ़ंक्शन पहले से ही परिभाषित होते हैं। फ़ंक्शन में दिखाई देने वाली स्क्रिप्ट की कमांड लाइन तर्क बनाने के "$@"
लिए स्पष्ट रूप से पारित करना main
आवश्यक है।
exit
कॉल टू मेन के रूप में एक ही लाइन पर स्पष्ट अनिवार्य नहीं है, लेकिन एक रनिंग स्क्रिप्ट को स्क्रिप्ट फ़ाइल में संशोधित होने से बचाने के लिए उपयोग किया जा सकता है। इसके बिना, शेल main
रिटर्न के बाद स्क्रिप्ट फ़ाइल से कमांड पढ़ना जारी रखने का प्रयास करेगा । ( इसे निष्पादित करने से पहले संपूर्ण शेल स्क्रिप्ट कैसे पढ़ें? देखें )
[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"
मुख्य फ़ंक्शन को कॉल करने के लिए उपयोग करता हूं ताकि मैं इसे किसी अन्य स्क्रिप्ट Main
में निष्पादित किए बिना ही स्रोत कर सकूं। फिर मैं या तो कार्यों का पुन: उपयोग कर सकता हूं या उन्हें जांचने के लिए परीक्षण लिख सकता हूं।
main "$@"; exit
( exit
उसी लाइन पर main
) के साथ भी उपयोगी है क्योंकि फाइल की व्याख्या की जा रही है, जबकि इसे संरक्षित किया जा रहा है।
exit
उसी लाइन पर डालते हैं जैसा कि main
हम सुनिश्चित करते हैं कि शेल main
रिटर्न के बाद फ़ाइल से फिर से कुछ भी नहीं पढ़ेगा ।
main; exit
, तो इससे कोई फर्क नहीं पड़ता है , main; exit $?
या main <EOF>
, सभी मामलों main
में स्क्रिप्ट के निकास कोड के रूप में निकास कोड का उपयोग किया जाता है। exit
किसी स्क्रिप्ट के चलते समय संपादित करता है, तो सिर्फ बातें में गड़बड़ हो रही रोकने के लिए किया जाएगा।
नहीं, फ़ंक्शन को कॉल करने के समय गोले के वातावरण में मौजूद होना चाहिए।
Google की "शेल स्टाइल गाइड" में इसके लिए एक निश्चितता है:
एक फ़ंक्शन जिसे
main
स्क्रिप्ट कहा जाता है, उसके लिए आवश्यक है कि कम से कम एक अन्य फ़ंक्शन शामिल हो।
स्क्रिप्ट के बहुत अंत में, सभी फ़ंक्शन के बाद, केवल एक फ़ंक्शन में कथन नहीं, आपके पास होगा
main "$@"
यह main
फ़ंक्शन को स्क्रिप्ट के दिए गए सभी मापदंडों के साथ कॉल करेगा । main
समारोह स्क्रिप्ट के शीर्ष पर स्थित किया जा सकता है (शैली गाइड तल पर यह डाल करने के लिए कहते हैं, लेकिन फिर, यह बहुत सी बातें कहते हैं)।
जब शेल main
कॉल पर जाता है , तो स्क्रिप्ट में सभी फ़ंक्शन पार्स किए गए हैं और इसलिए इसे main
फ़ंक्शन के भीतर से कॉल किया जा सकता है।
नहीं, फ़ंक्शंस का उपयोग करने से पहले उन्हें घोषित किया जाना चाहिए। शैल स्क्रिप्ट लाइन द्वारा लाइन पढ़ी जाती हैं और लाइन द्वारा लाइन पर कार्रवाई की जाती हैं; इसलिए एक फ़ंक्शन मौजूद नहीं है जब तक कि इसकी घोषणा को निष्पादित नहीं किया गया है।
C
आराम है।
. yourfile
)।
if
एक फ़ंक्शन के बाहर नंगे बयान नहीं हैं । जब आप कॉल करते हैं तो फ़ंक्शन को -containing फ़ंक्शन की घोषणा करते समय परिभाषित नहीं किया जाता है । if
शेल में declaring
फ़ंक्शन की कोई अवधारणा नहीं है। इसलिए आपके पास आगे की घोषणा नहीं हो सकती है।
एक परिणाम के रूप में, आपको इसे लागू करने से पहले शेल द्वारा फ़ंक्शन कार्यान्वयन को पढ़ने की आवश्यकता है।
autoload f
फ़ंक्शन घोषित करता है, लेकिन इसका शरीर केवल पहले आह्वान पर लोड होता है)। bash
हालांकि यह ओपी पर लागू नहीं होता है ।