शेल स्क्रिप्ट का उपयोगकर्ता कॉन्फ़िगरेशन। सर्वोत्तम प्रथाएं?


13

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

इसे कई तरीकों से लागू किया जा सकता है:

  1. स्वयं स्क्रिप्ट में प्लेसहोल्डर का उपयोग करें और sedस्थापना के दौरान उन्हें बदलने के लिए उपयोग करें (कुछ इस तरह: /programming/415677/how-to-replace-placeholders-in-a-text-file )

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

    • विपक्ष: एक बार वे जगह में होने के बाद इंस्टॉलर के माध्यम से चर को फिर से कॉन्फ़िगर करना मुश्किल है। जब तक मैं एक अधिक जटिल regexp नहीं बनाऊंगा जो त्रुटियों से ग्रस्त होगा।

  2. कॉन्फ़िगरेशन फ़ाइल का उपयोग करें , मूल रूप से असाइनमेंट के साथ एक और शेल स्क्रिप्ट, और sourceइसे शामिल करने के लिए उपयोग करें। (और शायद इसे अंदर रखें ~/.scriptname; मुख्य स्क्रिप्ट की प्रतिलिपि बनाई गई है /usr/local/bin)

    • पेशेवरों: स्क्रिप्ट को फिर से कॉन्फ़िगर करना आसान है। यहां तक ​​कि मुख्य स्क्रिप्ट से ऐसा करने के लिए एक पैरामीटर भी जोड़ा जा सकता है (संभवत: पहले समाधान में भी काम करेगा, लेकिन खुद से एक स्क्रिप्ट को संपादित करना बहुत अच्छा विचार नहीं है)

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

साथ ही, स्थापना के बाद उपयोगकर्ता द्वारा कॉन्फ़िगरेशन को कैसे प्रबंधित किया जाना चाहिए, इसके बारे में कुछ विकल्प:

  1. जैसे Git
    $ myscript config server.host example.org $ myscript config server.proxypath / घर / johndoe / प्रॉक्सी $ myscript config server.httppath / घर / johndoe / वेब

  2. इंटरएक्टिव
    $ myscript कॉन्फ़िगरेशन
    सर्वर होस्टनाम
    दर्ज करें : example.org सर्वर पर प्रॉक्सी के
    लिए पथ दर्ज करें: / home / johndoe /xy सर्वर पर http निर्देशिका का पथ दर्ज करें: / home / johndoe / web

  3. लंबे विकल्प
    $ myscript --host example.org के साथ गेटअप

  4. सरल
    $ myscript config example.org / home / johndoe /xy / home / johndoe / web

क्या ऐसा करने के कोई अन्य तरीके हैं जिन पर आप विचार करेंगे?
किसी भी सर्वोत्तम प्रथाओं, सुरुचिपूर्ण कुछ भी?


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

कुंआ। 'इंस्टॉलर' स्क्रिप्ट केवल वास्तविक स्क्रिप्ट डाउनलोड करेगी, इसे उसके सही स्थान पर कॉपी करेगी और कॉन्फ़िगरेशन के लिए प्रश्नों की एक श्रृंखला (3-4 चर) पूछ सकती है। इस तरह से मैं उपयोगकर्ताओं को एक कमांड लाइन दे सकता हूं, इंस्टॉल स्क्रिप्ट को भूलकर / bin / sh पर पाइप कर सकता है। Couse में से मैं इंस्टॉलर को छोड़ सकता हूं और सिर्फ मुख्य स्क्रिप्ट में 'इंस्टॉल' पैरामीटर जोड़ सकता हूं। शायद एक बेहतर समाधान, आपको क्या लगता है?
चार्ली रुडेनस्टाल

"लेकिन सवाल यह है कि आप कुछ इतना जटिल क्यों लिखना चाहते हैं", यहां प्रश्न में स्क्रिप्ट है: github.com/charlie-rudenstal/depo मैं नए उपयोगकर्ताओं को प्रदर्शन करने के लिए आवश्यक कदमों की मात्रा को कम करने की कोशिश कर रहा हूं, विशेष रूप से दौरान स्थापना। आवश्यक सर्वर सेटअप को स्वचालित बनाने में भी।
चार्ली रुडेनस्टाल

जवाबों:


6

मैं एक समझदार कार्यक्रम (शेल स्क्रिप्ट या नहीं) से क्या उम्मीद करूंगा:

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

अच्छी सलाह। क्या यह आपका पसंदीदा आदेश होगा? (1) कमांड लाइन में चेक की गई सेटिंग्स (2) एक ही डायरेक्टरी में .scriptnameConfig में सेटिंग की जाँच करें (3) एक पर्यावरण चर में सेटिंग की जाँच करें (4) ~ / .criptnameConfig (5) में .scriptnameConfig (5) की डिफ़ॉल्ट सेटिंग का उपयोग करें। सेटिंग
चार्ली रुडेनस्टेल

"कॉन्फ़िगरेशन फ़ाइल कमांड लाइन के रूप में बहुत ही सेटिंग नाम और सिंटैक्स का उपयोग करती है।" - यह कैसे दिखना है? मैं नियमित शेल स्क्रिप्ट के लिए असाइनमेंट सिंटैक्स का उपयोग करने जा रहा था: SETTING = VALUE। एक फ़ाइल के अंदर वाक्यविन्यास जैसा कुछ अजीब नहीं लगेगा?
चार्ली रुडेनस्टेल

देखें कि कैसे mountया sshआप कमांड लाइन पर और विन्यास में एक ही वाक्यविन्यास का उपयोग करने की अनुमति देते हैं। आपको कमांड लाइन सिंटैक्स को पूरी तरह से कॉपी करने की आवश्यकता नहीं है; '--foo = bar' के बजाय आप 'foo = bar' का उपयोग कर सकते हैं। यदि आप इसके बजाय 'BarOption: Foo' का उपयोग करते हैं, तो यह बहुत कम सुविधाजनक होगा: यह याद रखने की आवश्यकता है कि क्या मामला महत्वपूर्ण है, कौन सा कीवर्ड फाइल में स्वीकार किया गया है और कौन सी कमांड लाइन पर है, और एक वर्क कमांड को कॉपी-पेस्ट करने में असमर्थता है। केवल कॉस्मेटिक संपादन के साथ एक विन्यास फ़ाइल में पंक्ति।
9000

3

जब मुझे विभिन्न विन्यास विकल्पों के साथ एक विस्तृत स्क्रिप्ट लिखने की आवश्यकता होती है, तो मैं argparse और ConfigParser पुस्तकालयों के साथ पायथन का उपयोग करता हूं । कार्यान्वयन में मदद करते हैं, लेकिन प्रक्रिया किसी भी शेल स्क्रिप्ट पर लागू होती है:

  1. एक कॉन्फ़िगर फ़ाइल के लिए देखो। यदि कोई मौजूद है, तो किसी भी सेटिंग को डिक्शनरी / लुकअप टेबल में पढ़ें।
  2. Parse नाम कमांड लाइन तर्क। प्रदान किए गए प्रत्येक तर्क के लिए, यदि यह मौजूद है, तो कॉन्फ़िग फ़ाइल से लोड किए गए मान को ओवरराइड करें। किसी भी तर्क के लिए कमांड लाइन में पारित नहीं किया गया और कॉन्फ़िगरेशन में नहीं, एक डिफ़ॉल्ट का उपयोग करें।
  3. स्क्रिप्ट के मुख्य कार्य को निष्पादित करें
  4. यदि कॉन्फ़िग फ़ाइल मौजूद नहीं है, तो इसे पारित और / या डिफ़ॉल्ट मान लिखें।

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

मेरे सबसे हालिया मामले में, मैंने [DEFAULT]कॉन्फ़िगर फ़ाइल के शीर्ष पर अनुभाग के लिए डिफॉल्ट भी लिखा , फिर प्रत्येक के लिए उचित ओवरराइड्स के साथ प्रत्येक "पर्यावरण" के लिए एक अनुभाग था। "पर्यावरण" स्क्रिप्ट का पहला अनाम पैरामीटर है। तो इस मामले में मापदंडों को अंतर्निहित डिफ़ॉल्ट के रूप में चुना जाता है -> कॉन्फ़िगर फ़ाइल डिफ़ॉल्ट -> कॉन्फ़िगर फ़ाइल अनुभाग मान -> कमांड-लाइन पैरामीटर । एक अतिरिक्त कमांड लाइन पैरामीटर नवीनतम रन के मूल्य के साथ मौजूदा कॉन्फ़िगरेशन को अधिलेखित करने का विकल्प देता है। यह कॉन्फ़िगरेशन फ़ाइल वर्तमान निर्देशिका में लिखी गई है, इसलिए यह प्रति प्रोजेक्ट पर लागू होती है और बाकी कोड के साथ प्रतिबद्ध हो सकती है। उसी प्रोजेक्ट की जाँच करने वाला कोई भी व्यक्ति उसी कॉन्फ़िगरेशन से शुरू करेगा।


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

+1, मैं भी default.configस्क्रिप्ट के समान निर्देशिका में स्थित फ़ाइल में डिफॉल्ट सेट करने की सलाह दूंगा , फिर ~/.scriptnameइन मूल्यों को ओवरराइड करने के लिए एक कॉन्फिग फ़ाइल की तलाश करूँगा । इस तरह हर मूल्य का एक वैध डिफ़ॉल्ट मूल्य होता है और इसका रखरखाव आसान होता है।
आरोन

2

प्लेसहोल्डर का संपादन त्रुटि प्रवण है।

मैं एक विन्यास फाइल का उपयोग करके जाऊंगा।

निर्भरता के बारे में आपकी चिंता वैध है, हालांकि, मुझे बहुत सारे उपकरणों का उपयोग करना याद नहीं है जो एक फ़ाइल से बना है। इसलिए सैद्धांतिक रूप से आप सही हैं, लेकिन व्यावहारिक रूप से यह काफी ठीक होना चाहिए।

एक तीसरा विकल्प कॉन्फ़िगरेशन सॉफ़्टवेयर को एक नया सिलवाया संस्करण लिखना है जो चयनित विकल्पों और मापदंडों के लिए विशिष्ट है। यह लिखना कठिन है और पाठ्यक्रम का परीक्षण :)

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