শেল স্ক্রিপ্টের ব্যবহারকারী কনফিগারেশন। সেরা অনুশীলন?


13

আমি কয়েকটি ভেরিয়েবলের সাথে শেল স্ক্রিপ্ট লিখছি যা ব্যবহারকারীর দ্বারা কনফিগার করা উচিত। স্ক্রিপ্টটি ডাউনলোড এবং কনফিগার করার জন্য একটি ইনস্টলার থাকবে, সম্ভবত একটি সিরিজ প্রশ্ন জিজ্ঞাসা করে। প্রশ্নে থাকা স্ক্রিপ্টটি অন্য বিকাশকারীদের লক্ষ্য।

এটি বিভিন্ন উপায়ে প্রয়োগ করা যেতে পারে:

  1. স্থানধারক ব্যবহার স্ক্রিপ্ট নিজেই এবং ব্যবহারে sedইনস্টলেশনের সময় তাদের প্রতিস্থাপন (ভালো কিছু: /programming/415677/how-to-replace-placeholders-in-a-text-file )

    • পেশাদাররা: সমস্ত পরিবর্তনশীল সংজ্ঞা স্ক্রিপ্টের মধ্যে থাকে। স্ক্রিপ্টটি ম্যানুয়ালি ডাউনলোড করা সহজ এবং ইনস্টলারের চেয়ে কোনও সম্পাদককে পছন্দ করে এমন ব্যবহারকারীদের জন্য ভেরিয়েবলগুলি কনফিগার করা সহজ।

    • কনস: ইনস্টলারের মাধ্যমে ভেরিয়েবলগুলি একবারে স্থাপনের পরে এটি পুনরায় কনফিগার করা শক্ত। যদি না আমি আরও জটিল রেজিএক্সপ্যাক তৈরি করি যা ত্রুটিগুলির প্রবণ হতে পারে।

  2. একটি কনফিগার ফাইল ব্যবহার করুন , মূলত অ্যাসাইনমেন্ট সহ অন্য শেল স্ক্রিপ্ট, এবং sourceএটি অন্তর্ভুক্ত করার জন্য ব্যবহার করুন । (এবং সম্ভবত এটিতে রাখবেন ~/.scriptname? মূল স্ক্রিপ্টটি অনুলিপি করা হয়েছে /usr/local/bin)

    • পেশাদাররা: স্ক্রিপ্টটি পুনরায় কনফিগার করা সহজ। এমনকি মূল স্ক্রিপ্ট থেকে এটি করার জন্য একটি প্যারামিটার যুক্ত করতে পারে (সম্ভবত প্রথম সমাধানেও সম্ভবত এটি কাজ করবে তবে নিজে থেকে কোনও স্ক্রিপ্ট সম্পাদনা করা খুব ভাল ধারণা বলে মনে হয় না)

    • কনস: স্ক্রিপ্টটি এখন দুটি ফাইলের উপর নির্ভরশীল এবং ব্যবহারকারীর কনফিগারেশন ফাইল তৈরির জন্য ইনস্টলারটি চালানো প্রয়োজন। এটির কোনও অস্তিত্ব না থাকলে একটি কনফিগার ফাইল তৈরি করে স্বয়ংক্রিয়ভাবে সমাধান করা যেতে পারে। তবে বাহ্যিক কনফিগারেশন ফাইলটি সনাক্ত করা এখনও সেই ব্যবহারকারীদের জন্য আরও জটিল হয়ে উঠবে যারা কেবল স্ক্রিপ্টটি ডাউনলোড করতে, এটি সম্পাদনা করতে এবং এটি দিয়ে সম্পন্ন করতে চান।

এছাড়াও, ইনস্টলেশনের পরে ব্যবহারকারীর দ্বারা কনফিগারেশনটি কীভাবে পরিচালনা করা উচিত সে সম্পর্কে কয়েকটি বিকল্প:


  1. $ মাইক্রিপ্ট কনফিগারেশন সার্ভারের মতো গিট ost উদাহরণস্বরূপ .org মাইক্রিপ্ট কনফিগারেশন সার্ভার.প্রক্সিপাথ / হোম / জোহন্ডয়ে / প্রক্সি $ মাইক্রিপ্ট কনফিগারেশন সার্ভার। Httppath / home / jhndoe / ওয়েব

  2. ইন্টারেক্টিভ
    $ ম্যাসক্রিপ্ট কনফিগারেশন
    সার্ভারের হোস্টনামটি
    লিখুন : উদাহরণ. org সার্ভারে প্রক্সিটির জন্য
    প্রবেশ পথটি প্রবেশ করুন : / home / jhndoe / প্রক্সি সার্ভারের http ডিরেক্টরিতে প্রবেশের পথটি প্রবেশ করান: / home / jhndoe / ওয়েব

  3. দীর্ঘ অপশন সহ
    গিওপটস $ রহস্য - হোস্ট উদাহরণ.অর্গ - প্রক্সিপথ / হোম / জোনডো / প্রক্সি --httppath / হোম / জোহন্ডো / ওয়েব

  4. সরল
    $ মাইক্রিপ্ট কনফিগারেশন উদাহরণ ..org / হোম / জনডো / প্রক্সি / হোম / জহন্ডো / ওয়েব

এটি করার অন্য কোনও উপায় আছে যা আপনি বিবেচনা করবেন?
কোনও সেরা অনুশীলন, মার্জিত কিছু?


2
আমি সন্দেহ করি না যে আপনি একটি শেল স্ক্রিপ্ট লিখতে পারেন যা এই সমস্ত কিছু করে, তবে প্রশ্ন হল আপনি কেন এত জটিল কিছু লিখতে চান কারণ এটির জন্য শেল স্ক্রিপ্টে একটি ইনস্টলার প্রয়োজন। যাইহোক, লিনাক্স কার্নেল কনফিগারেশন সিস্টেমটি তার কনফিগারেশন ফাইলটি পরিচালনা করে তা দেখুন।

আমরা হব. 'ইনস্টলার' স্ক্রিপ্টটি কেবল আসল স্ক্রিপ্টটি ডাউনলোড করবে, এটিকে তার সঠিক স্থানে অনুলিপি করবে এবং কনফিগারেশনের জন্য একাধিক প্রশ্ন জিজ্ঞাসা করবে (3-4 ভেরিয়েবল)। এইভাবে আমি ব্যবহারকারীদের একটি একক কমান্ড লাইন দিতে পারি, ইনস্টল স্ক্রিপ্টটি wgetting করে এবং এটি / bin / sh এ পাইপ করতে পারি। কুউসের মধ্যে আমি ইনস্টলারটি এড়িয়ে যেতে পারি এবং মূল স্ক্রিপ্টে কেবল একটি 'ইনস্টল' পরামিতি যুক্ত করতে পারি। সম্ভবত একটি ভাল সমাধান, আপনি কি মনে করেন?
চার্লি রুডেনস্টাল

"তবে প্রশ্নটি হল আপনি কেন এত জটিল কিছু লিখতে চান", এখানে স্ক্রিপ্টটি প্রশ্নের মধ্যে রয়েছে: github.com/charlie-rudenstal/depo আমি নতুন ব্যবহারকারীদের যে পদক্ষেপগুলি করতে হবে তা হ্রাস করার চেষ্টা করছি, বিশেষ করে সময়কালে স্থাপন. প্রয়োজনীয় সার্ভার সেটআপটি স্বয়ংক্রিয়ভাবে তৈরি করার বিষয়েও তাকাচ্ছেন।
চার্লি রুডেনস্টাল

উত্তর:


6

বুদ্ধিমান প্রোগ্রামের (শেল স্ক্রিপ্টের বা না) থেকে আমি কী আশা করব:

  • আমি কখনও এটির কনফিগার করতে এক্সিকিউটেবলকে কখনও পরিবর্তন করতে পারি না । এটি কোনও ওএস কার্নেল নয়।
  • আমি কমান্ড লাইন ব্যবহার করে যে কোনও সেটিংস পাস করতে পারি। যুক্তিযুক্ত ডিফল্ট না থাকা প্রতিটি টুকরো তথ্যের জন্য এটি আবশ্যক। একমাত্র ব্যতিক্রম একটি পাসওয়ার্ড যা ইন্টারেক্টিভ ইনপুট প্রয়োজন।
  • Allyচ্ছিকভাবে, আমি একটি পরিবেশের ভেরিয়েবল ব্যবহার করে একটি সেটিংস পাস করতে পারি।
  • আমি সেটিংসটি একটি কনফিগার ফাইলে লিখে রাখতে পারি, এবং এই ফাইলটি ব্যবহৃত হয় যদি এটি একটি সুপরিচিত নামের অধীনে উপস্থিত থাকে বা উপরের দুটি পদ্ধতি ব্যবহার করে স্পষ্টভাবে নির্দেশ করে।
  • কনফিগার ফাইলটি একই কমান্ড লাইন হিসাবে সেটিং নাম এবং বাক্য গঠন ব্যবহার করে uses

দুর্দান্ত পরামর্শ। এটি কি আপনার পছন্দসই অর্ডার হবে? (1) কমান্ড লাইনে উত্তীর্ণ সেটিংস পরীক্ষা করুন (২) একই ডিরেক্টরিতে একটি .ScriptnameConfig এ সেটিং পরীক্ষা করুন (3) পরিবেশের ভেরিয়েবলের সেটিং চেক করুন (4) cript / .ScriptnameConfig এ .ScriptnameConfig এ চেক সেটিং পরীক্ষা করুন (5) ডিফল্ট ব্যবহার করুন সেটিং
চার্লি রুডেনস্টাল

"কনফিগার ফাইলে কমান্ড লাইন হিসাবে খুব একই সেটিং নাম এবং বাক্য গঠন ব্যবহার করে।" - এই দেখার অনুভূতি কেমন? আমি নিয়মিত শেল স্ক্রিপ্টগুলির জন্য অ্যাসাইনমেন্ট সিনট্যাক্স ব্যবহার করতে যাচ্ছিলাম: SETTING = VALUE। সিন্টেক্সের মতো কমান্ডটি কোনও কনফিগার ফাইলের মধ্যে কিছুটা অদ্ভুত বোধ করবে না?
চার্লি রুডেনস্টাল

কমান্ড লাইনে এবং কনফিগারেশনে কীভাবে আপনাকে একই সিনট্যাক্স ব্যবহার করতে mountবা sshঅনুমতি দেয় তা দেখুন । আপনার সম্পূর্ণ কমান্ড লাইন সিনট্যাক্স অনুলিপি করার দরকার নেই; '--foo = বার' এর পরিবর্তে আপনি 'foo = বার' ব্যবহার করতে পারেন। আপনি যদি এর পরিবর্তে 'বারোপশন: ফু' ব্যবহার করেন তবে এটি অনেক কম সুবিধাজনক হবে: কেসটি উল্লেখযোগ্য কিনা তা মনে রাখা দরকার, ফাইলটিতে কোন কীওয়ার্ড গ্রহণ করা হয়েছে এবং কোনটি কমান্ড লাইনে এবং কোনও ওয়ার্কিং কমান্ড অনুলিপি-অনুলিপি করতে অক্ষম শুধুমাত্র কসমেটিক সম্পাদনা সহ একটি কনফিগার ফাইলে লাইন করুন।
9000

3

যখন আমাকে বিভিন্ন কনফিগারেশন বিকল্পের সাথে একটি বিস্তৃত স্ক্রিপ্ট লিখতে হবে তখন আমি আরগপার্স এবং কনফিগার পার্সার লাইব্রেরি দিয়ে পাইথন ব্যবহার করি । এগুলি বাস্তবায়নে সহায়তা করে তবে প্রক্রিয়াটি কোনও শেল স্ক্রিপ্টে প্রযোজ্য:

  1. একটি কনফিগার ফাইল অনুসন্ধান করুন। যদি এটি উপস্থিত থাকে তবে এটি কোনও অভিধান / লক সারণিতে থাকা কোনও সেটিংস পড়ুন।
  2. নামের কমান্ড লাইনের যুক্তিগুলি পার্স করুন। প্রদত্ত প্রতিটি যুক্তির জন্য, কনফিগারেশন ফাইল থেকে লোড হওয়া মানটি যদি বিদ্যমান থাকে তবে তা ওভাররাইড করুন। কোনও যুক্তি কমান্ড লাইনে এবং কনফিগারেশনে পাস না হওয়ার জন্য, একটি ডিফল্ট ব্যবহার করুন।
  3. স্ক্রিপ্টের মূল ফাংশন সম্পাদন করুন
  4. যদি কনফিগারেশন ফাইলটি বিদ্যমান না থাকে তবে এতে পাস এবং / অথবা ডিফল্ট মান লিখুন।

স্ক্রিপ্টটি বারবার ব্যবহৃত হতে চলেছে এমন পছন্দসই বিকল্পগুলি ধরে রাখার জন্য একটি কনফিগার ফাইলের জন্য আমার অগ্রাধিকার, তবে কোনও কমান্ড লাইন আর্গুমেন্টকে ওভাররাইড করতে দেয়। কনফিগারেশন ফাইলটি লিখুন যখন প্রথমবার এটি চালানো হয়েছে it's এরপরে কনফিগারেশন ফাইলটি ভাগ করে একটি কোড ভান্ডারে প্রতিশ্রুতিবদ্ধ হতে পারে।

আমার সাম্প্রতিক ক্ষেত্রে আমি [DEFAULT]কনফিগার ফাইলের শীর্ষে বিভাগে ডিফল্টগুলিও লিখেছিলাম , তারপরে প্রতিটি "পরিবেশ" -এর জন্য প্রতিটি বিভাগের জন্য উপযুক্ত ওভাররাইড সহ একটি বিভাগ ছিল। "পরিবেশ" হ'ল স্ক্রিপ্টের প্রথম নামবিহীন প্যারামিটার। সুতরাং এই ক্ষেত্রে প্যারামিটারগুলি অন্তর্নির্মিত ডিফল্ট -> কনফিগার ফাইল ডিফল্ট -> কনফিগার ফাইল বিভাগের মান -> কমান্ড-লাইন প্যারামিটার হিসাবে বেছে নেওয়া হয় । একটি অতিরিক্ত কমান্ড লাইন প্যারামিটার সর্বশেষ রানের মান সহ বিদ্যমান কনফিগারেশনটি ওভাররাইট করার বিকল্প দেয়। এই কনফিগারেশন ফাইলটি বর্তমান ডিরেক্টরিতে লিখিত হয়েছে যাতে এটি প্রতি প্রকল্পের জন্য প্রযোজ্য এবং বাকী কোডের সাথে প্রতিশ্রুতিবদ্ধ হতে পারে। অন্য যে কেউ একই প্রকল্পটি যাচাই করছেন তার পরে একই কনফিগারেশন দিয়ে শুরু হবে।


"একটি অতিরিক্ত কমান্ড লাইন প্যারামিটার সর্বশেষ রানের মান সহ বিদ্যমান কনফিগারেশনটি ওভাররাইট করার বিকল্প দেয়।" এটি একটি আকর্ষণীয় পদ্ধতির। কনফিগারেশনের সাথে পরামিতিগুলিকে একত্রিত করার একটি সহজ উপায়।
চার্লি রুডেনস্টাল

+1, এছাড়াও আমি default.configএকই ডিরেক্টরিতে স্ক্রিপ্টের মতো একটি ফাইলে ডিফল্ট সেট করার পরামর্শ দেব , তারপরে ~/.scriptnameএই মানগুলিকে ওভাররাইড করার জন্য একটি কনফিগার ফাইল অনুসন্ধান করতে চাই। এইভাবে প্রতিটি মানের একটি বৈধ ডিফল্ট মান থাকে এবং এটি বজায় রাখা সহজ।
অ্যারন

2

স্থানধারীদের সম্পাদনা করা ত্রুটিযুক্ত।

আমি একটি কনফিগার ফাইল ব্যবহার করে যেতে হবে।

নির্ভরতা সম্পর্কে আপনার উদ্বেগ বৈধ, তবে, আমি মনে করি না যে একটি একক ফাইলের সমন্বিত অনেকগুলি সরঞ্জাম ব্যবহার করা। সুতরাং তাত্ত্বিকভাবে আপনি সঠিক, তবে ব্যবহারিকভাবে এটি বেশ ঠিক হওয়া উচিত।

একটি তৃতীয় বিকল্প কনফিগারেশন সফ্টওয়্যার করা হয় লিখতে নির্বাচিত অপশন এবং পরামিতি নির্দিষ্ট একটি নতুন উপযোগী সংস্করণ। এটি অবশ্যই লেখা এবং পরীক্ষা করা কঠিন হতে পারে :)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.