ठेठ अनिवार्य प्रोग्रामिंग में , आप निर्देशों के अनुक्रम लिखते हैं और उन्हें स्पष्ट नियंत्रण प्रवाह के साथ एक के बाद एक निष्पादित किया जाता है। उदाहरण के लिए:
if [ -f file1 ]; then # If file1 exists ...
cp file1 file2 # ... create file2 as a copy of a file1
fi
आदि।
जैसा कि उदाहरण से देखा जा सकता है, अनिवार्य प्रोग्रामिंग में आप निष्पादन प्रवाह का काफी आसानी से पालन करते हैं, हमेशा अपने निष्पादन के संदर्भ को निर्धारित करने के लिए कोड की किसी भी पंक्ति से अपने तरीके से काम कर रहे हैं, यह जानते हुए कि आपके द्वारा दिए गए किसी भी निर्देश को उनके परिणामस्वरूप निष्पादित किया जाएगा। प्रवाह में स्थान (या उनके कॉल साइटों के स्थान, यदि आप फ़ंक्शन लिख रहे हैं)।
कॉलबैक प्रवाह को कैसे बदलता है
जब आप कॉलबैक का उपयोग करते हैं, तो निर्देशों का एक सेट "भौगोलिक रूप से" का उपयोग करने के बजाय, आप वर्णन करते हैं कि इसे कब बुलाया जाना चाहिए। अन्य प्रोग्रामिंग वातावरण में विशिष्ट उदाहरण ऐसे मामले हैं जैसे "इस संसाधन को डाउनलोड करें, और जब डाउनलोड पूरा हो जाए, तो इस कॉलबैक को कॉल करें"। बैश में इस तरह का जेनेरिक कॉलबैक निर्माण नहीं है, लेकिन इसमें त्रुटि-हैंडलिंग और कुछ अन्य स्थितियों के लिए कॉलबैक हैं ; उदाहरण के लिए (किसी को पहले कमांड प्रतिस्थापन और बाश निकास मोड को समझने के लिए उस उदाहरण को समझना होगा):
#!/bin/bash
scripttmp=$(mktemp -d) # Create a temporary directory (these will usually be created under /tmp or /var/tmp/)
cleanup() { # Declare a cleanup function
rm -rf "${scripttmp}" # ... which deletes the temporary directory we just created
}
trap cleanup EXIT # Ask Bash to call cleanup on exit
यदि आप इसे स्वयं आज़माना चाहते हैं, तो उपरोक्त फ़ाइल में सहेजें, कहें cleanUpOnExit.sh
, इसे निष्पादन योग्य बनाएं और इसे चलाएं:
chmod 755 cleanUpOnExit.sh
./cleanUpOnExit.sh
यहाँ मेरा कोड कभी भी स्पष्ट रूप से cleanup
फ़ंक्शन को कॉल नहीं करता है; यह बैश को कहता है कि इसे कब कॉल करना है, अर्थातtrap cleanup EXIT
, "प्रिय बैश, जब आप बाहर निकलें तो कृपया कमांड चलाएं " (और यह एक ऐसा फंक्शन होगा जिसे मैंने पहले परिभाषित किया था, लेकिन यह बैश कुछ भी हो सकता है)। बैश सभी गैर-घातक संकेतों, निकास, कमांड विफलताओं और सामान्य डीबगिंग के लिए इसका समर्थन करता है (आप कॉलबैक निर्दिष्ट कर सकते हैं जो हर कमांड से पहले चलाया जाता है)। यहां कॉलबैक फ़ंक्शन है, जो शेल से बाहर निकलने से ठीक पहले बैश द्वारा "वापस बुलाया जाता है"।cleanup
cleanup
cleanup
आप कमांड के रूप में शेल मापदंडों का मूल्यांकन करने के लिए बैश की क्षमता का उपयोग कर सकते हैं, कॉलबैक-उन्मुख ढांचे का निर्माण कर सकते हैं; यह कुछ हद तक इस उत्तर के दायरे से बाहर है, और संभवतः यह सुझाव देकर और अधिक भ्रम पैदा करेगा कि पासिंग फ़ंक्शंस में हमेशा कॉलबैक शामिल होता है। बैश देखें : अंतर्निहित कार्यक्षमता के कुछ उदाहरणों के लिए एक फ़ंक्शन को पैरामीटर के रूप में पास करें । इवेंट-हैंडलिंग कॉलबैक के साथ यहां विचार यह है कि फ़ंक्शन डेटा को मापदंडों के रूप में ले सकता है, लेकिन अन्य फ़ंक्शन भी - यह कॉलर्स को व्यवहार के साथ-साथ डेटा प्रदान करने की अनुमति देता है। इस दृष्टिकोण का एक सरल उदाहरण लग सकता है
#!/bin/bash
doonall() {
command="$1"
shift
for arg; do
"${command}" "${arg}"
done
}
backup() {
mkdir -p ~/backup
cp "$1" ~/backup
}
doonall backup "$@"
(मुझे पता है कि यह थोड़ा बेकार है क्योंकि cp
यह कई फाइलों से निपट सकता है, यह केवल चित्रण के लिए है।)
यहां हम एक फ़ंक्शन बनाते हैं doonall
, जो एक अन्य कमांड लेता है, जिसे एक पैरामीटर के रूप में दिया जाता है, और इसे अपने बाकी मापदंडों पर लागू करता है; फिर हम backup
स्क्रिप्ट को दिए गए सभी मापदंडों पर फ़ंक्शन को कॉल करने के लिए उपयोग करते हैं । परिणाम एक स्क्रिप्ट है जो अपने सभी तर्कों को एक-एक करके बैकअप निर्देशिका में कॉपी करता है।
इस तरह के दृष्टिकोण से कार्यों को एकल जिम्मेदारियों के साथ लिखने की अनुमति मिलती है: doonall
इसकी जिम्मेदारी अपने सभी तर्कों पर एक समय में कुछ चलाने की है; backup
एक बैकअप निर्देशिका में इसके (एकमात्र) तर्क की एक प्रति बनाना जिम्मेदारी है। दोनों doonall
और backup
अन्य संदर्भों, जो और अधिक कोड फिर से उपयोग की अनुमति देता है, बेहतर परीक्षण आदि में इस्तेमाल किया जा सकता
इस मामले में कॉलबैक backup
फ़ंक्शन है, जिसे हम doonall
इसके प्रत्येक अन्य तर्कों पर "कॉल बैक" के लिए कहते हैं - हम doonall
व्यवहार (इसके पहले तर्क) के साथ-साथ डेटा (शेष तर्क) प्रदान करते हैं।
(ध्यान दें कि दूसरे उदाहरण में जिस तरह के उपयोग-मामले का प्रदर्शन किया गया है, मैं स्वयं "कॉलबैक" शब्द का उपयोग नहीं करूंगा, लेकिन शायद यह एक आदत है जिसके परिणामस्वरूप मैं उन भाषाओं का उपयोग करता हूं। मैं इसे पासिंग फ़ंक्शन या लैम्बडा के रूप में सोचता हूं। एक घटना उन्मुख प्रणाली में कॉलबैक दर्ज करने के बजाय।)