2010-02-18 7 views
10

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

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

लोगों इस व्यवहार के लिए किसी भी अच्छा समाधान है, पूर्व को कॉपी एक tempfile को खोल स्क्रिप्ट और उस से चल के अलावा अन्य है?

धन्यवाद, /YGA

+0

, जबकि चल रहा है संपादन से बचने के लिए आप भी स्क्रिप्ट हटा सकते हैं। कारण [यह पोस्ट] देखें (http://stackoverflow.com/questions/8335747/emacs-workflow-to-edit-bash-scripts-while-they-run) कारण और इसे स्वचालित करने के लिए कैसे करें। –

उत्तर

16

नीचे अन्य उत्तर के लिए बहुत मामूली अलावा:

#!/bin/sh 
{ 
    # Your stuff goes here 
    exit 
} 

exit अंत में महत्वपूर्ण है। अन्यथा, स्क्रिप्ट फ़ाइल को अभी भी अंत में एक्सेस किया जा सकता है यह देखने के लिए कि क्या व्याख्या करने के लिए कोई और पंक्तियां हैं या नहीं।

यह सवाल बाद में यहां फिर से पोस्ट किया गया था: Can a shell script indicate that its lines be loaded into memory initially?

+1

जोनाथन लेफ्लर का समाधान अच्छा है, लेकिन बाहर निकलने के बिना मेरे लिए काम नहीं कर रहा था :-) – YGA

2

यकीन खोल इसके किसी भी निष्पादित करने से पहले पूरी फ़ाइल को पार्स करने है बनाओ:

#!/bin/ksh 
{ 
all the original script here 
} 

यही काम कर देता है।

संयोग से, पर्ल (और मैं अजगर मान) के साथ, कार्यक्रम इसके किसी भी क्रियान्वित करने से पहले पूरी फ़ाइल, बिल्कुल के रूप में यहाँ की सिफारिश की पार्स करता है। यही कारण है कि आप आमतौर पर पर्ल या पायथन के साथ समस्या में भाग नहीं लेते हैं।

+0

इस कोड में एक दोष है। [उपयोगकर्ता द्वारा जवाब "अज्ञात"] देखें (http://stackoverflow.com/a/2358432/780703)। –

2

वांछित व्यवहार शेल स्क्रिप्ट है कि शामिल कर रहे हैं की जटिलता के आधार संभव नहीं हो सकता।

यदि पूर्ण खोल स्क्रिप्ट एक स्रोत फ़ाइल में निहित है, और वह फ़ाइल निष्पादन से पहले पूरी तरह से पार्स की गई है, तो शेल स्क्रिप्ट निष्पादन के दौरान डिस्क पर प्रतिलिपि में संशोधनों से आम तौर पर सुरक्षित होती है। एक समारोह (या कार्यों की श्रृंखला) में सभी निष्पादन योग्य बयानों को लपेटना आम तौर पर आपके द्वारा प्राप्त लक्ष्य को प्राप्त करेगा।

#!/bin/sh 

doit() 
{ 
# Stuff goes here 
} 
# Main 
doit 

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

इसके अलावा, यदि खोल स्क्रिप्ट किसी भी बाहरी कार्यक्रम (जैसे खोल स्क्रिप्ट, संकलित कार्यक्रम, आदि) चलाता है, कि परिणाम तक निष्पादन में उस बिंदु (कभी तो) तक पहुँच जाता है पर कब्जा कर लिया नहीं है।

#!/bin/sh 

doit() 
{ 
    if [[some_condition]] ; then 
     resultone=$(external_program) 
    fi 
} 
# Main 
doit 
+0

आपके कोड को 'sh' के लिए छद्म कोड माना जाना चाहिए। –

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

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