2010-02-25 2 views
8

अद्यतन:क्या एक शेल स्क्रिप्ट इंगित कर सकती है कि इसकी लाइनों को शुरुआत में स्मृति में लोड किया जा सकता है?

  1. मैं एक त्वरित और गंदा काम
  2. के लिए एक खोल स्क्रिप्ट (बैश) लिखें: इस How to make shell scripts robust to source being changed as they run

    यह एक छोटे से बात यह है कि मुझे हर अब और फिर परेशान है की एक पोस्ट है मैं स्क्रिप्ट चलाने, और यह काफी देर

  3. हालांकि यह चल रहा है, मैं, स्क्रिप्ट की कुछ पंक्तियों में संपादित एक अलग काम
  4. लेकिन पहले की प्रक्रिया के लिए यह विन्यस्त करने अब भी वही स्क्रिप्ट फ़ाइल पढ़ रही है और हो जाता है के लिए चलाता है सब बँधा हुआ।

जाहिर है, स्क्रिप्ट फ़ाइल के रूप में यह की जरूरत है से प्रत्येक पंक्ति लोड करके व्याख्या की है। क्या कोई तरीका है कि मैं स्क्रिप्ट को खोल को इंगित कर सकता हूं कि पूरी स्क्रिप्ट फ़ाइल को स्मृति में एक बार में पढ़ा जाना चाहिए? उदाहरण के लिए, पर्ल स्क्रिप्ट्स ऐसा करने लगते हैं: कोड फ़ाइल को संपादित करने से ऐसी प्रक्रिया प्रभावित नहीं होती है जो वर्तमान में इसे व्याख्या कर रही है (क्योंकि इसे प्रारंभ में पार्स/संकलित किया गया है?)।

मैं समझता हूं कि इस समस्या के आसपास कई तरीके हैं I उदाहरण के लिए, मैं की तरह कुछ की कोशिश कर सकते:

cat script.sh | sh 

या

sh -c "`cat script.sh`" 

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

तो मैं सबसे सरल समाधान की उम्मीद कर रहा था जिसमें केवल स्क्रिप्ट के लिए संशोधन शामिल होंगे, जिस तरह से इसे लागू किया जाता है। क्या मैं स्क्रिप्ट की शुरुआत में बस एक या दो पंक्ति जोड़ सकता हूं? मुझे नहीं पता कि ऐसा समाधान मौजूद है या नहीं, लेकिन मुझे लगता है कि यह $ 0 चर का उपयोग कर सकता है ...

+3

यह http://stackoverflow.com/questions/2285403/how-to-make-shell-scripts-robust-to-source-being-changed-as-they-run – camh

+0

का डुप्लिकेट धन्यवाद, कैम! यह पूर्ण है। – Anonymous

+0

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

उत्तर

7

मुझे मिला सबसे अच्छा जवाब How to make shell scripts robust to source being changed as they run पर दिए गए समाधानों पर बहुत ही मामूली बदलाव है। Repost नोटिंग के लिए camh के लिए धन्यवाद!

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

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

मदद के लिए सभी को धन्यवाद!

2

इस बारे में एक समाधान के बारे में कि आप इसे कैसे संपादित करते हैं।

स्क्रिप्ट चल रहा है, यह संपादन करने से पहले, इस कार्य करें:

mv script script-old 
cp script-old script 
rm script-old 

के बाद से खोल रखें की फाइल जब तक आप खुले inode सब कुछ की सामग्री में परिवर्तन नहीं करते के रूप में ठीक से काम करेंगे खोलें।

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

+0

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

+1

थोड़ा सा सरलीकृत: 'सीपी स्क्रिप्ट स्क्रिप्ट-पुराना; एमवी स्क्रिप्ट-पुरानी लिपि ' –

+0

आप मूल फ़ाइल को हटा सकते हैं। प्रश्न पर मेरी टिप्पणी देखें। –

2

एक ऐसे संपादक का उपयोग करें जो मौजूदा फ़ाइल को संशोधित नहीं करता है, और इसके बजाय एक नई फ़ाइल बनाता है तो पुरानी फ़ाइल को प्रतिस्थापित करता है। उदाहरण के लिए, विम में :set writebackup backupcopy=no का उपयोग करना।

0

अपनी त्वरित और गंदे नौकरियों के लिए एक नया बैंग पथ बनाने पर विचार करें। यदि आप अपनी स्क्रिप्ट को इसके साथ शुरू करते हैं: #!/usr/local/fastbash

या कुछ, तो आप एक फास्टबैश रैपर लिख सकते हैं जो आपके द्वारा वर्णित विधियों में से एक का उपयोग करता है।पोर्टेबिलिटी के लिए, कोई भी फास्टबैश से बैश करने के लिए सिमलिंक बना सकता है, या स्क्रिप्ट में एक टिप्पणी कर सकता है कि कोई भी बैश के साथ फास्टबैश को प्रतिस्थापित कर सकता है।

0

यदि आप Emacs का उपयोग करते हैं, तो M-x customize-variable break-hardlink-on-save आज़माएं। इस चर को सेट करने से Emacs को एक temp फ़ाइल में लिखने के लिए कहा जाएगा और फिर मूल फ़ाइल को संपादित करने के बजाय मूल पर temp फ़ाइल का नाम बदलें। जब आप नए संस्करण को सहेजते हैं तो इसे चलने वाले इंस्टेंस को अपने असम्बद्ध संस्करण को रखने की अनुमति देनी चाहिए।

संभवतः, अन्य अर्द्ध बुद्धिमान संपादकों के समान विकल्प होंगे।

+0

धन्यवाद, यह emacs उपयोगकर्ताओं के लिए एक महान युक्ति है, और मैं शायद इसे अब से अपनी डिफ़ॉल्ट सेटिंग बना दूंगा। लेकिन अभी भी मेरी चल रही स्क्रिप्ट को खराब होने से बचाने की समस्या है अगर कोई और इसे संपादित करता है ... – Anonymous

+0

यह काम नहीं करता है। शायद यह केवल सचमुच मुश्किल लिंक तोड़ने के लिए है, फाइल को एक नई बचत के साथ बदलने के लिए नहीं। –

1

बैश प्रलेखन के अनुसार अगर बजाय

#!/bin/bash 
body of script 

आप

#!/bin/bash 
script=$(cat <<'SETVAR' 
body of script 
SETVAR) 
eval "$script" 

कोशिश तो मुझे लगता है कि आप व्यवसाय में हो जाएगा।

+0

धन्यवाद, नॉर्मन! यह पूरी तरह से काम करता है यदि आप सुनिश्चित करते हैं कि आपकी स्क्रिप्ट 'निकास' में समाप्त होती है। हालांकि, यह नकारात्मक है कि आप emacs में सुंदर प्रिंट रंग स्वरूपण खो देते हैं ... – Anonymous

+0

वैसे भी डॉन emacs! –