क्या "कॉलबैक" प्रोग्रामिंग की अवधारणा बैश में मौजूद है?


21

कुछ समय जब मैंने प्रोग्रामिंग के बारे में पढ़ा तो मुझे "कॉलबैक" अवधारणा के बारे में पता चला।

मजेदार रूप से, मुझे कभी भी एक स्पष्टीकरण नहीं मिला जिसे मैं "डिडक्टिक" या "क्लियर" कह सकता हूं इस शब्द "कॉलबैक फ़ंक्शन" के लिए (लगभग कोई भी स्पष्टीकरण जो मैंने पढ़ा है वह मुझे दूसरे से काफी अलग लग रहा था और मुझे उलझन महसूस हुई)।

क्या बैश में प्रोग्रामिंग की "कॉलबैक" अवधारणा मौजूद है? यदि हां, तो कृपया एक छोटे, सरल, बैश उदाहरण के साथ उत्तर दें।


2
क्या "कॉलबैक" एक वास्तविक अवधारणा है या यह "प्रथम श्रेणी का कार्य" है?
सेड्रिक एच।

आपको declarative.bashदिलचस्प लग सकता है , एक रूपरेखा के रूप में जो किसी दिए गए मूल्य की आवश्यकता होने पर स्पष्ट रूप से कॉन्फ़िगर किए गए कार्यों का लाभ उठाता है।
चार्ल्स डफी

एक अन्य प्रासंगिक रूपरेखा: बाशप / ईवेंट । इसके दस्तावेज़ीकरण में कॉलबैक उपयोग के बहुत सारे सरल डेमो शामिल हैं, जैसे कि सत्यापन, लुकअप आदि के लिए
पीजे ईबी सेप

1
@CedricH। आपके लिए वोट किया गया। "कॉलबैक" एक वास्तविक अवधारणा है या क्या यह "प्रथम श्रेणी का कार्य" है? "एक और प्रश्न के रूप में पूछना एक अच्छा सवाल है?"
प्रोसिडि-गब वेरिबल कॉन्टेक्ट

मैं कॉलबैक का मतलब समझता हूं "एक फ़ंक्शन जिसे किसी दिए गए इवेंट के बाद वापस बुलाया जाता है"। क्या वो सही है?
जॉनडोए

जवाबों:


44

ठेठ अनिवार्य प्रोग्रामिंग में , आप निर्देशों के अनुक्रम लिखते हैं और उन्हें स्पष्ट नियंत्रण प्रवाह के साथ एक के बाद एक निष्पादित किया जाता है। उदाहरण के लिए:

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 , "प्रिय बैश, जब आप बाहर निकलें तो कृपया कमांड चलाएं " (और यह एक ऐसा फंक्शन होगा जिसे मैंने पहले परिभाषित किया था, लेकिन यह बैश कुछ भी हो सकता है)। बैश सभी गैर-घातक संकेतों, निकास, कमांड विफलताओं और सामान्य डीबगिंग के लिए इसका समर्थन करता है (आप कॉलबैक निर्दिष्ट कर सकते हैं जो हर कमांड से पहले चलाया जाता है)। यहां कॉलबैक फ़ंक्शन है, जो शेल से बाहर निकलने से ठीक पहले बैश द्वारा "वापस बुलाया जाता है"।cleanupcleanupcleanup

आप कमांड के रूप में शेल मापदंडों का मूल्यांकन करने के लिए बैश की क्षमता का उपयोग कर सकते हैं, कॉलबैक-उन्मुख ढांचे का निर्माण कर सकते हैं; यह कुछ हद तक इस उत्तर के दायरे से बाहर है, और संभवतः यह सुझाव देकर और अधिक भ्रम पैदा करेगा कि पासिंग फ़ंक्शंस में हमेशा कॉलबैक शामिल होता है। बैश देखें : अंतर्निहित कार्यक्षमता के कुछ उदाहरणों के लिए एक फ़ंक्शन को पैरामीटर के रूप में पास करें । इवेंट-हैंडलिंग कॉलबैक के साथ यहां विचार यह है कि फ़ंक्शन डेटा को मापदंडों के रूप में ले सकता है, लेकिन अन्य फ़ंक्शन भी - यह कॉलर्स को व्यवहार के साथ-साथ डेटा प्रदान करने की अनुमति देता है। इस दृष्टिकोण का एक सरल उदाहरण लग सकता है

#!/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व्यवहार (इसके पहले तर्क) के साथ-साथ डेटा (शेष तर्क) प्रदान करते हैं।

(ध्यान दें कि दूसरे उदाहरण में जिस तरह के उपयोग-मामले का प्रदर्शन किया गया है, मैं स्वयं "कॉलबैक" शब्द का उपयोग नहीं करूंगा, लेकिन शायद यह एक आदत है जिसके परिणामस्वरूप मैं उन भाषाओं का उपयोग करता हूं। मैं इसे पासिंग फ़ंक्शन या लैम्बडा के रूप में सोचता हूं। एक घटना उन्मुख प्रणाली में कॉलबैक दर्ज करने के बजाय।)


25

पहले यह नोट करना महत्वपूर्ण है कि फ़ंक्शन क्या करता है कॉलबैक फ़ंक्शन यह कैसे उपयोग किया जाता है, न कि यह क्या करता है। कॉलबैक तब होता है जब आप जो कोड लिखते हैं उसे उस कोड से कहा जाता है जिसे आपने नहीं लिखा था। जब कोई विशेष घटना घटती है, तो आप सिस्टम को वापस बुलाने के लिए कह रहे हैं।

शेल प्रोग्रामिंग में कॉलबैक का एक उदाहरण जाल है। जाल एक कॉलबैक है जिसे एक फ़ंक्शन के रूप में व्यक्त नहीं किया जाता है, लेकिन मूल्यांकन करने के लिए कोड के एक टुकड़े के रूप में। जब शेल किसी विशेष सिग्नल को प्राप्त करता है तो आप अपने कोड को कॉल करने के लिए कह रहे हैं।

कॉलबैक का एक अन्य उदाहरण कमांड की -execकार्रवाई है findfindकमांड का काम निर्देशिकाओं की पुनरावृत्ति करना और प्रत्येक फ़ाइल को बदले में संसाधित करना है। डिफ़ॉल्ट रूप से, प्रसंस्करण फ़ाइल नाम (अंतर्निहित -print) मुद्रित करने के लिए है , लेकिन -execप्रसंस्करण के साथ एक कमांड चलाना है जिसे आप निर्दिष्ट करते हैं। यह एक कॉलबैक की परिभाषा को फिट करता है, हालांकि कॉलबैक पर जाते हैं, यह बहुत लचीला नहीं है क्योंकि कॉलबैक एक अलग प्रक्रिया में चलता है।

यदि आपने एक खोज जैसा कार्य कार्यान्वित किया है, तो आप प्रत्येक फ़ाइल पर कॉल करने के लिए कॉलबैक फ़ंक्शन का उपयोग कर सकते हैं। यहां एक अल्ट्रा-सरलीकृत खोज जैसा फ़ंक्शन है जो फ़ंक्शन नाम (या बाहरी कमांड नाम) को तर्क के रूप में लेता है और इसे वर्तमान निर्देशिका और इसके उपनिर्देशिकाओं में सभी नियमित फ़ाइलों पर कॉल करता है। फ़ंक्शन का उपयोग कॉलबैक के रूप में किया जाता है जिसे हर बार call_on_regular_filesएक नियमित फ़ाइल मिलने पर कॉल किया जाता है ।

shopt -s globstar
call_on_regular_files () {
  declare callback="$1"
  declare file
  for file in **/*; do
    if [[ -f $file ]]; then
      "$callback" "$file"
    fi
  done
}

कॉलबैक शेल प्रोग्रामिंग में उतने सामान्य नहीं हैं जितने कुछ अन्य वातावरण में हैं क्योंकि शेल मुख्य रूप से सरल कार्यक्रमों के लिए डिज़ाइन किए गए हैं। कॉलबैक उन वातावरणों में अधिक आम हैं जहां डेटा और नियंत्रण प्रवाह को कोड के कुछ हिस्सों के बीच आगे और पीछे ले जाने की संभावना होती है जो स्वतंत्र रूप से लिखे और वितरित किए जाते हैं: आधार प्रणाली, विभिन्न पुस्तकालय, अनुप्रयोग कोड।


1
विशेष रूप से अच्छी तरह से समझाया गया
रोआमा

1
@ जॉनसन मुझे लगता है कि विचार यह है कि यह अति सरल है कि यह एक ऐसा कार्य नहीं है जिसे आप वास्तव में लिखेंगे। लेकिन शायद एक भी सरल उदाहरण पर कॉलबैक चलाने के लिए एक हार्ड-कोडेड सूची के साथ कुछ होगा: foreach_server() { declare callback="$1"; declare server; for server in 192.168.0.1 192.168.0.2 192.168.0.3; do "$callback" "$server"; done; }जो आप के रूप में चला सकते हैं foreach_server echo, foreach_server nslookupआदि declare callback="$1"के बारे में सरल हालांकि के रूप में यह हो सकता है के रूप में: कॉलबैक कहीं पास होने के लिए गया है, या यह कॉलबैक नहीं है।
IMSoP

4
'कॉलबैक तब होता है जब आप जो कोड लिखते हैं उसे उस कोड से कहा जाता है जिसे आपने नहीं लिखा था।' बस गलत है। आप एक ऐसी चीज लिख सकते हैं जो कुछ गैर-अवरोधक async काम करता है, और इसे कॉलबैक के साथ चलाएं जब यह पूरा हो जाएगा। कुछ भी नहीं है जो कोड लिखा से संबंधित है,
mikemaccana

5
@mikemaccana बेशक यह संभव है कि एक ही व्यक्ति ने कोड के दो हिस्सों को लिखा हो। लेकिन यह आम मामला नहीं है। मैं एक अवधारणा की मूल बातें समझा रहा हूं, एक औपचारिक परिभाषा नहीं दे रहा हूं। यदि आप सभी कोने के मामलों की व्याख्या करते हैं, तो मूल बातें बताना मुश्किल है।
गिल्स एसओ- बुराई को रोकें '

1
सुन के अच्छा लगा। मैं इस बात से असहमत हूं कि कॉलबैक और कॉलबैक का उपयोग करने वाले दोनों कोड लिखने वाले लोग आम नहीं हैं या एक किनारे का मामला है, और इस भ्रम के कारण, कि यह उत्तर मूल बातें बताता है।
मिकमेकाना

7

"कॉलबैक" केवल अन्य कार्यों के तर्क के रूप में पारित किए गए कार्य हैं।

शेल स्तर पर, इसका मतलब है कि स्क्रिप्ट / फ़ंक्शन / कमांड अन्य स्क्रिप्ट / फ़ंक्शन / कमांड के तर्क के रूप में पारित हो गए हैं।

अब, एक साधारण उदाहरण के लिए, निम्नलिखित लिपि पर विचार करें:

$ cat ~/w/bin/x
#! /bin/bash
cmd=$1; shift
case $1 in *%*) flt=${1//\%/\'%s\'};; *) flt="$1 '%s'";; esac; shift
q="'\\''"; f=${flt//\\/'\\'}; p=`printf "<($f) " "${@//\'/$q}"`
eval "$cmd" "$p"

सिनोप्सिस होना

x command filter [file ...]

filterप्रत्येक fileतर्क पर लागू होगा , फिर commandफ़िल्टर के आउटपुट के साथ तर्क के रूप में कॉल करें ।

उदाहरण के लिए:

x diff zcat a.gz b.bz   # diff gzipped files
x diff3 zcat a.gz b.gz c.gz   # same with three-way diff
x diff hd a b  # hex diff of binary files
x diff 'zcat % | sort -u' a.gz b.gz  # first uncompress the files, then sort+uniq them, then compare them
x 'comm -12' sort a b  # find common lines in unsorted files

यह बहुत करीब है कि आप लिस्प में क्या कर सकते हैं (सिर्फ मजाक कर रहे हैं ;-))

कुछ लोग "कॉलबैक" शब्द को "ईवेंट हैंडलर" और / या "क्लोजर" (फ़ंक्शन + डेटा / पर्यावरण ट्यूपल) तक सीमित करने पर जोर देते हैं; यह आम तौर पर स्वीकृत अर्थ का कोई रास्ता नहीं है। और एक कारण है कि उन संकीर्ण इंद्रियों में "कॉलबैक" शेल में बहुत अधिक उपयोग नहीं होता है क्योंकि पाइप + समानांतरवाद + गतिशील प्रोग्रामिंग क्षमताएं बहुत अधिक शक्तिशाली हैं, और आप पहले से ही प्रदर्शन के मामले में उनके लिए भुगतान कर रहे हैं, भले ही आप शेल को एक क्लंकी संस्करण के रूप में उपयोग करने का प्रयास करें perlया python


हालांकि आपका उदाहरण बहुत उपयोगी लगता है, यह पर्याप्त रूप से घना है कि मुझे वास्तव में इसे बैश मैनुअल के साथ चुनना होगा ताकि यह पता चले कि यह कैसे काम करता है (और मैंने सालों तक सरलतम बैश के साथ काम किया है।) मैंने कभी नहीं सीखा। तुतलाना। ;)
जो

1
@ जो अगर केवल दो इनपुट फ़ाइलों के साथ काम करना ठीक है और %फ़िल्टर में कोई प्रक्षेप नहीं है, तो पूरी चीज़ को कम किया जा सकता है cmd=$1; shift; flt=$1; shift; $cmd <($flt "$1") <($flt "$2"):। लेकिन यह एक बहुत ही कम उपयोगी और इमोशनल इमो है।
मस्जिद

1
या इससे भी बेहतर$1 <($2 "$3") <($2 "$4")
बजे

+1 धन्यवाद। आपकी टिप्पणियों, प्लस ने इसे घूरते हुए और कुछ समय के लिए कोड के साथ खेलते हुए, मेरे लिए इसे स्पष्ट किया। मैंने एक नया शब्द, "स्ट्रिंग इंटरपोलेशन" भी सीखा, जो मैं हमेशा से उपयोग करता रहा हूं।
जो

4

एक प्रकार का।

बैश में कॉलबैक को लागू करने का एक सरल तरीका, प्रोग्राम के नाम को एक पैरामीटर के रूप में स्वीकार करना है, जो "कॉलबैक फ़ंक्शन" के रूप में कार्य करता है।

# This is script worker.sh accepts a callback in $1
cb="$1"
....
# Execute the call back, passing 3 parameters
$cb foo bar baz

इसका उपयोग इस तरह किया जाएगा:

# Invokes mycb.sh as a callback
worker.sh mycb.sh

बेशक आप को कोसने में बंद नहीं है। इसलिए, कॉलबैक फ़ंक्शन का कॉलर पक्ष पर चर तक पहुंच नहीं है। हालाँकि, आप पर्यावरण चर में कॉलबैक जरूरतों को डेटा स्टोर कर सकते हैं। कॉलबैक से वापस आकर स्क्रिप्ट में जानकारी पास करना मुश्किल है। डेटा को एक फ़ाइल में रखा जा सकता है।

यदि आपका डिज़ाइन यह अनुमति देता है कि सब कुछ एक ही प्रक्रिया में संभाला जाता है, तो आप कॉलबैक के लिए शेल फ़ंक्शन का उपयोग कर सकते हैं, और इस मामले में कॉलबैक फ़ंक्शन में इनवॉकर की ओर चर की पहुंच होती है।


3

बस कुछ शब्दों को दूसरे उत्तरों में जोड़ना है। फ़ंक्शन कॉलबैक फ़ंक्शन पर बाहरी कार्य करता है जो फ़ंक्शन को कॉल करता है। इसके लिए यह संभव हो सकता है कि फ़ंक्शन को वापस बुलाया जाने वाले फ़ंक्शन की पूरी परिभाषा फ़ंक्शन को वापस कॉल करने के लिए पारित करने की आवश्यकता है, या इसका कोड फ़ंक्शन को वापस कॉल करने के लिए उपलब्ध होना चाहिए।

पूर्व (किसी अन्य फ़ंक्शन के लिए कोड पास करना) संभव है, हालांकि मैं इसके लिए एक उदाहरण छोड़ दूंगा जिसमें जटिलता शामिल होगी। उत्तरार्द्ध (नाम से फ़ंक्शन पास करना) एक सामान्य अभ्यास है, क्योंकि एक फ़ंक्शन के दायरे के बाहर घोषित चर और फ़ंक्शन उस फ़ंक्शन में उपलब्ध हैं जब तक कि उनकी परिभाषा फ़ंक्शन को कॉल करती है जो उन पर काम करती है (जो बदले में होती है) , जैसा कि यह कहा जाता है से पहले घोषित किया जाएगा)।

यह भी ध्यान दें, कि जब निर्यात किया जाता है तो एक समान बात होती है। एक शेल जो एक फ़ंक्शन को आयात करता है, उसके पास एक रूपरेखा तैयार हो सकती है और उन्हें कार्य में लगाने के लिए फ़ंक्शन परिभाषाओं की प्रतीक्षा कर रहा है। समारोह निर्यात बाश में मौजूद है और पहले गंभीर समस्याओं के कारण, btw (जिसे शेलशॉक कहा जाता था):

मैं इस उत्तर को किसी फ़ंक्शन को किसी अन्य फ़ंक्शन में पास करने की एक और विधि के साथ पूरा करूंगा, जो कि बाश में स्पष्ट रूप से मौजूद नहीं है। यह एक पते से इसे पारित कर रहा है, नाम से नहीं। यह पर्ल में पाया जा सकता है, उदाहरण के लिए। बैश इस तरह से न तो कार्यों के लिए प्रदान करता है, और न ही चर। लेकिन, यदि आप राज्य करते हैं, तो आप बस एक उदाहरण के रूप में बैश के साथ एक व्यापक तस्वीर रखना चाहते हैं, तो आपको पता होना चाहिए, कि फ़ंक्शन कोड मेमोरी में कहीं निवास कर सकता है, और उस कोड को उस मेमोरी स्थान द्वारा एक्सेस किया जा सकता है, जो है इसका पता बताया।


2

बैश में कॉलबैक के सबसे सरल उदाहरणों में से एक बहुत से लोगों से परिचित है, लेकिन उन्हें इस बात का एहसास नहीं है कि वे वास्तव में कौन से डिज़ाइन पैटर्न हैं:

क्रॉन

क्रोन आपको एक निष्पादन योग्य (एक बाइनरी या स्क्रिप्ट) निर्दिष्ट करने की अनुमति देता है कि कुछ शर्तों के पूरा होने पर क्रोन प्रोग्राम वापस कॉल करेगा (समय)

कहते हैं कि आपके पास एक स्क्रिप्ट है doEveryDay.sh। स्क्रिप्ट लिखने का गैर-कॉलबैक तरीका है:

#! /bin/bash
while true; do
    doSomething
    sleep $TWENTY_FOUR_HOURS
done

इसे लिखने का कॉलबैक तरीका बस है:

#! /bin/bash
doSomething

फिर crontab में आप कुछ ऐसा सेट करेंगे

0 0 * * *     doEveryDay.sh

फिर आपको घटना को ट्रिगर करने के लिए प्रतीक्षा करने के लिए कोड लिखने की आवश्यकता नहीं होगी, बल्कि cronअपने कोड को वापस कॉल करने के लिए भरोसा करना होगा।


अब, विचार करें कि कैसे आप इस कोड को बैश में लिखेंगे।

कैसे आप किसी अन्य स्क्रिप्ट / फ़ंक्शन को bash में निष्पादित करेंगे?

चलो एक समारोह लिखें:

function every24hours () {
    CALLBACK=$1 ;# assume the only argument passed is
                 # something we can "call"/execute
    while true; do
        $CALLBACK ;# simply call the callback
        sleep $TWENTY_FOUR_HOURS
    done
}

अब आपने एक फ़ंक्शन बनाया है जो कॉलबैक स्वीकार करता है। आप बस इसे इस तरह से कॉल कर सकते हैं:

# "ping" google website every day
every24hours 'curl google.com'

बेशक, हर 24 घंटे समारोह कभी नहीं लौटता है। बैश थोड़ा अनूठा है कि हम इसे आसानी से अतुल्यकालिक बना सकते हैं और जोड़कर एक प्रक्रिया को आगे बढ़ा सकते हैं &:

every24hours 'curl google.com' &

यदि आप इसे एक फ़ंक्शन के रूप में नहीं चाहते हैं, तो आप इसकी बजाय स्क्रिप्ट के रूप में कर सकते हैं:

#every24hours.sh
CALLBACK=$1 ;# assume the only argument passed is
               # something we can "call"/execute
while true; do
    $CALLBACK ;# simply call the callback
    sleep $TWENTY_FOUR_HOURS
done

जैसा कि आप देख सकते हैं, बैश में कॉलबैक तुच्छ है। यह बस है:

CALLBACK_SCRIPT=$3 ;# or some other 
                    # argument to 
                    # function/script

और कॉलबैक कॉलिंग बस है:

$SOME_CALLBACK_FUNCTION_OR_SCRIPT

जैसा कि आप ऊपर प्रपत्र देख सकते हैं, कॉलबैक शायद ही कभी भाषाओं की सीधे विशेषताएं हैं। वे आमतौर पर मौजूदा भाषा सुविधाओं का उपयोग करके रचनात्मक तरीके से प्रोग्रामिंग कर रहे हैं। कोई भी भाषा जो किसी कोड ब्लॉक / फंक्शन / स्क्रिप्ट की पॉइंटर / रेफरेंस / कॉपी स्टोर कर सकती है, कॉलबैक लागू कर सकती है।


कॉलबैक को स्वीकार करने वाले कार्यक्रमों / लिपियों के अन्य उदाहरणों में शामिल हैं watchऔर find(जब -execपैरामीटर के साथ उपयोग किया जाता है)
स्लीवेटमैन

0

एक कॉलबैक एक फ़ंक्शन है जिसे कुछ घटना तब होती है। के साथ bash, जगह में एकमात्र ईवेंट हैंडलिंग तंत्र संकेतों, शेल से बाहर निकलने से संबंधित है, और शेल त्रुटियों की घटनाओं, डिबग घटनाओं और फ़ंक्शन / sourced लिपियों की वापसी की घटनाओं तक विस्तारित है।

यहाँ एक बेकार लेकिन सरल कॉलबैक लीवरेजिंग सिग्नल ट्रैप का एक उदाहरण है।

पहले कॉलबैक को लागू करने वाली स्क्रिप्ट बनाएं:

#!/bin/bash

myCallback() {
    echo "I've been called at $(date +%Y%m%dT%H%M%S)"
}

# Set the handler
trap myCallback SIGUSR1

# Main loop. Does nothing useful, essentially waits
while true; do
    read foo
done

फिर एक टर्मिनल में स्क्रिप्ट चलाएँ:

$ ./allall-example

और दूसरे एक पर, USR1शेल प्रक्रिया को संकेत भेजें ।

$ pkill -USR1 callback-example

भेजे गए प्रत्येक सिग्नल को पहले टर्मिनल में इन लोगों की तरह लाइनों के प्रदर्शन को ट्रिगर करना चाहिए:

I've been called at 20180925T003515
I've been called at 20180925T003517

ksh93, जैसा कि शेल bashने बाद में अपनाई गई कई विशेषताओं को लागू किया है , यह प्रदान करता है कि इसे "अनुशासन फ़ंक्शन" कहा जाता है। bashजब शेल चर को संशोधित या संदर्भित (यानी पढ़ा जाता है) के साथ उपलब्ध नहीं हैं, तो ये फ़ंक्शन कहलाते हैं। यह अधिक रोचक ईवेंट संचालित एप्लिकेशन के लिए रास्ता खोलता है।

उदाहरण के लिए, इस सुविधा ने ग्राफिक विगेट्स पर X11 / Xt / मोटिफ स्टाइल कॉलबैक की अनुमति दी, जिसे पुराने kshग्राफिक संस्करण में लागू किया गया था , जिसमें ग्राफिक डिज़ाइनर कहा जाता है dtkshDksh मैनुअल देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.