2011-01-07 18 views
9

जहां तक ​​मुझे पता है कि बैश फ़ंक्शन में स्थानीय चर बनाने के दो तरीके हैं: एक सबहेल बनाएं या प्रत्येक वैरिएबल को स्थानीय के रूप में घोषित करें।बैश में स्थानीय चर: स्थानीय बनाम सबहेल

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

# using local 
function foo 
{ 
    local count 
    for count in $(seq 10) 
    do 
    echo $count 
    done 
} 

या

# using subshell 
function foo 
{ 
    (
    for count in $(seq 10) 
    do 
     echo $count 
    done 
) 
} 

Obvisously संस्करण क्योंकि आप सभी चर स्थानीय घोषित करने के बारे में परवाह करने की जरूरत नहीं लिखने के लिए subshell का उपयोग कर सरल है (उल्लेख करने के लिए नहीं (पर्यावरण) getopts जैसे उपकरणों द्वारा निर्मित/निर्यात किए गए चर)। लेकिन मैं कल्पना कर सकता था कि एक सबहेल बनाने के ऊपर एक ओवरहेड है।

तो बेहतर दृष्टिकोण क्या है? पेशेवर/विपक्ष क्या हैं?

+0

बाहर निकल जाएगा, अच्छी तरह से एक 1000 परीक्षणों पर 'time' आदेश चला और पाते हैं ओवरहेड से बाहर, मुझे लगता है कि यह अस्तित्व में छोटा है। – Anders

उत्तर

9

उप-खोल बनाने में fork() शामिल है, इसलिए यह निश्चित रूप से स्थानीय चर के मुकाबले ओवरहेड है। जबकि उप-गोले सस्ते हैं — जब आप एक — की आवश्यकता होती है तो आप उनकी लागत के बारे में चिंता नहीं करते हैं, वे स्वतंत्र नहीं हैं।

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

हालांकि, स्पष्टता के संदर्भ में, स्पष्ट होना और चर — को घोषित करना बेहतर है, इससे स्क्रिप्ट तोड़ने का खतरा कम हो जाता है क्योंकि कोई साथ आता है और कहता है "यह उप-खोल स्पष्ट रूप से आवश्यक नहीं है" (और यह वास्तव में नहीं है; मैं आपके कार्यों से उप-गोले को हटाना चाहता हूं)।

पर्ल स्क्रिप्ट के विकास को देखें। उन्होंने मांग के अस्तित्व में आने वाले चर के साथ एक मुक्त-के रूप में शुरू किया। वे धीरे-धीरे अधिक कठोर हो गए हैं, सामान्य शैली अब सभी चरों को पूर्ववत करने जा रही है। कुछ हद तक, गोले एक समान पथ — का पालन करते हैं लेकिन पर्ल के रूप में कठोर रूप से नहीं। Awk भी एक दिलचस्प मामला अध्ययन है; इसके कार्य वैश्विक चर का उपयोग करते हैं जब तक वे फ़ंक्शन के लिए तर्क नहीं होते हैं, जो 3 सक्रिय तर्क (कहें) और 5 निष्क्रिय तर्कों के साथ लिखे गए कार्यों को जन्म देता है जो प्रभावी रूप से स्थानीय चर को परिभाषित करते हैं। यह थोड़ा सनकी है, हालांकि यह 'काम करता है'।

0

अब, सुनिश्चित करें कि सभी कार्य हमेशा स्थानीय रूप में सभी चर घोषित करते हैं, काफी मुश्किल है।

मुझे लगता है कि यह बहुत ही त्रुटियां उत्पन्न हो सकती है और हमेशा subshell-कार्यों का उपयोग करना पसंद:

f() (
echo "we are a subshell" 
) 

कोई स्थानीय चर घोषित करने के लिए की जरूरत है - लेकिन यह भी कोई रास्ता नहीं वैश्विक चर बदलने के लिए। मेरी राय में कौन सा अच्छा है!

एक अतिरिक्त परिणाम यह है कि आपको हमेशा ऐसे कार्यों के रिटर्न/निकास कोड की जांच करने और तदनुसार कार्य करने की आवश्यकता होती है! यह है, क्योंकि आप सबस्केल फ़ंक्शन के भीतर से स्क्रिप्ट से बाहर नहीं निकल सकते हैं!

f() (
    echo "Trying to exit" 
    exit 1 
) 

f 
echo "Did not exit" 

यह आपकी स्क्रिप्ट से बाहर नहीं निकलेगा। आप इसे इस तरह से करने की जरूरत है: "। लेकिन मैं कल्पना कर सकता है कि एक subshell बनाने एक ओवरहेड है"

f() (
    echo "Trying to exit" 
    exit 1 
) 

f || exit $? 
echo "Did not exit" 

यह

संबंधित मुद्दे