()
वाक्यविन्यास के बिना , वाक्यविन्यास वास्तव में अस्पष्ट होगा।
कुछ होना ही हैकिसी फ़ंक्शन को परिभाषित करने के लिए अस्पष्ट सिंटैक्स , और अन्य शेल सिंटैक्स को पर्याप्त रूप से बदलने के बिना , यह होना चाहिए:
do_something {
# one or more commands go here
}
आपने कहा कि यह "इसके वर्तमान सिंटैक्स के साथ भ्रमित नहीं होता है," लेकिन यह करता है! ध्यान दें कि जब आप उस की पहली पंक्ति को चलाने का प्रयास करते हैं तो आपको किसी भी प्रकार की सिंटैक्स त्रुटि नहीं मिलती है । आपको एक त्रुटि मिलती है, लेकिन यह सिंटैक्स के बारे में कोई त्रुटि नहीं है। दूसरी पंक्ति, }
एक वाक्यविन्यास त्रुटि है, लेकिन पहली पंक्ति नहीं है। बजाय,do_something {
एक कमांड चलाने का प्रयास किया जाता है do_something
और {
उस कमांड के तर्क के रूप में पास होता है :
$ do_something {
do_something: command not found
यदि पहले से ही कोई कमांड है do_something
, तो आप इसे चला रहे हैं। यदि पहले से कोई फंक्शन है do_something
, तो आप उसे कॉल कर रहे हैं । यह सामान्य रूप से महत्वपूर्ण है कि वाक्यविन्यास अस्पष्ट हो, लेकिन यह भी विशेष रूप से महत्वपूर्ण है कि किसी फ़ंक्शन को गलती से कॉल किए बिना इसे फिर से परिभाषित करना संभव है। एक फ़ंक्शन को परिभाषित करना और इसे कॉल करना एक समान नहीं दिखना चाहिए।
शेल कैसे व्यवहार करता है {
और (
।
जैसा कि type {
आपको बताएंगे, {
एक शेल कीवर्ड है। यह इसे पसंद करता है[[
। यदि ऐसी स्थिति में उपयोग किया जाता है जहां यह अन्यथा एक कमांड होगी, तो {
विशेष शब्दार्थ का वहन करती है। विशेष रूप से, यह कमांड ग्रुपिंग करता है। हालांकि, अन्य स्थितियों में, इसका उपयोग एक शाब्दिक {
चरित्र को निरूपित करने के लिए किया जा सकता है । इसमें एक कमांड के दूसरे या बाद के शब्द के रूप में इसे पारित करने की स्थिति शामिल है।
बेशक, बैश को{
अलग-अलग तरीके से व्यवहार करने के लिए डिज़ाइन किया जा सकता था जो वर्तमान में है। हालाँकि, इसके सिंटैक्स को अब POSIX शेल के साथ संगत नहीं किया गया था, और बैश वास्तव में बॉर्न-शैली का शेल नहीं होगा और कई शेल स्क्रिप्ट चलाने में सक्षम नहीं होगा।
इसके विपरीत, (
एक शेल मेटाचैकर है। यह हमेशा विशेष रूप से इलाज किया जाता है अगर यह एक आदेश में प्रकट होता है और उद्धृत नहीं है (के साथ '
'
, "
"
या \
)। इस प्रकार वाक्य रचना में कोई अस्पष्टता नहीं है:
do_something() {
# one or more commands go here
}
इसका मतलब कुछ और नहीं हो सकता। यदि बैश में फ़ंक्शन नहीं थे, तो यह एक सिंटैक्स त्रुटि होगी, उसी कारण echo foo(bar)
से सिंटैक्स त्रुटि है।
यदि आप वास्तव में ()
संकेतन को नापसंद करते हैं तो आप कीवर्ड का उपयोग कर सकते हैं function
और इसे छोड़ सकते हैं, जैसा कि सुडोडस उल्लेख करते हैं । ध्यान दें कि यह अधिकांश अन्य बॉर्न-शैली के गोले में फ़ंक्शंस को परिभाषित करने के लिए सिंटैक्स का हिस्सा नहीं है - और कुछ में, यह समर्थित है लेकिन इस तरह से परिभाषित किए गए फ़ंक्शंस में अलग-अलग शब्दार्थ हैं - और इसलिए एक स्क्रिप्ट जो इसका उपयोग करती है वह पोर्टेबल नहीं होगी। (इस वाक्यविन्यास के अयोग्य होने का कारण यह है कि function
यह बाश में स्वयं एक खोजशब्द है जो यह दर्शाता है कि जो भी इसका अनुसरण करता है वह फ़ंक्शन परिभाषा की शुरुआत है।)
अंत में, ध्यान दें कि जब अधिकांश फ़ंक्शन परिभाषाएँ {
अभ्यास में उपयोग होती हैं, तो किसी भी मिश्रित कमांड की अनुमति है। यदि आपके पास एक ऐसा कार्य है जिसका शरीर आप हमेशा एक उपधारा में चलाना चाहते हैं, तो आप इसके (
)
बजाय उपयोग कर सकते हैं {
}
।