কমান্ড লাইন আর্গুমেন্ট ডিজাইনের জন্য ভাল অভ্যাসগুলি কী কী?


190

অ্যাপ্লিকেশনটি বিকাশের সময় আমি ভাবতে শুরু করি - কমান্ড লাইন আর্গুমেন্টগুলি কীভাবে ডিজাইন করব?

প্রোগ্রাম অনেক ভালো সূত্র ব্যবহার করছেন -argument valueবা /argument value। আমার মনে যে সমাধানটি এসেছিল তা ছিল argument:value। আমি ভেবেছিলাম এটি ভাল কারণ কোনও সাদা জায়গা ছাড়াই মান এবং যুক্তিগুলি গণ্ডগোলের উপায় নেই। এছাড়াও বাম :অক্ষর থেকে প্রথমটিতে একটি স্ট্রিংকে দুটিতে বিভক্ত করা সহজ ।

আমার প্রশ্নগুলি হ'ল:

  1. জনপ্রিয় -argument valueসূত্রটি কি argument:valueআরও ভাল (আরও পাঠযোগ্য, সহজে লেখার জন্য সহজ, বাগফ্রি, বিশেষজ্ঞ বিকাশকারীদের দ্বারা বোঝার পক্ষে সহজ)?
  2. কমান্ড লাইন আর্গুমেন্টগুলি ডিজাইনের সময় আমার কিছু অনুসরণীয় নিয়মাবলী অনুসরণ করা উচিত (এটি যদি কাজ করে তবে এটি ঠিক আছে কি?)

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

আমরা এমন একটি অ্যাপ্লিকেশন নিয়ে কাজ করছি যা পাবলিক প্লেসে (টাচ টোটেম, টেবিল) ব্যবহৃত হবে। অ্যাপ্লিকেশনগুলি Qt quick 5 (C ++, QML, JS) ব্যবহার করে লেখা হয়। ডিভাইসগুলিতে উইন্ডোজ 8.1 / 10 ইনস্টল করা হবে। আমরা ডিভাইসগুলি পরিচালনা করতে ফ্রন্ট-এন্ড ইন্টারফেস সরবরাহ করব। তবে কিছু উন্নত প্রশাসক নিজেরাই অ্যাপ্লিকেশনটি কনফিগার করতে চাইতে পারেন। ব্যবসায়ের দিক থেকে এটি খুব গুরুত্বপূর্ণ নয় তবে কিলিয়ান ফথ যা বলেছিল তার সাথে আমি একমত হিসাবে আমি চাই না যে আমার অ্যাপ্লিকেশনটি কোনও ব্যবহারকারীর জন্য ব্যথা হয়ে উঠুক । আমি এখানে যা চাই তা ইন্টারনেটে সন্ধান করা হচ্ছে না।


আরও উন্নত স্ট্যাক এক্সচেঞ্জ ব্যবহারকারীদের কাছে: আমি এই প্রশ্নটি সাধারণ হতে চেয়েছিলাম। হতে পারে এটি সম্প্রদায়ের উইকিতে যোগ্যতা অর্জন করে (বিদ্যমান প্রশ্নের উত্তরগুলির সাথে রূপান্তর করা যায় কিনা তা আমি জানি না)। যেহেতু আমি চাই এই প্রশ্নটি অপারেটিং সিস্টেম এবং প্রোগ্রামিং ল্যাঙ্গুয়েজে স্বতন্ত্র হওয়া উচিত উত্তরগুলি এখানে উপস্থিত হওয়া অন্যান্য বিকাশকারীদের জন্য একটি মূল্যবান পাঠ হতে পারে।


14
জনপ্রিয় কমান্ড লাইন সরঞ্জামগুলির দিকে নজর দিন। উদাহরণস্বরূপ, একক হাইফেন প্রায়শই সংমিশ্রনের বিকল্পগুলিকে অনুমতি দেওয়ার জন্য ব্যবহৃত হয়। যেমন আপনি ls -ltrবিকল্পগুলি একত্রিত করতে লিখতে পারেন -l, -tএবং -r। জিএনইউ স্টাইলের প্রোগ্রামগুলি সাধারণত শব্দ-ভিত্তিক বিকল্পগুলির --reverseপরিবর্তে ডাবল হাইফেনের সাহায্য করে -r। অন্যান্য জনপ্রিয় কনভেনশন রয়েছে যেমন -hসহায়তা দেখাতে, --বিকল্পগুলির শেষের সিগন্যাল করা, -
স্টিডিন

72
আমরাও -argument valueনা -argument:valueসাধারণ। সাধারণ -a value, -avalueএবং --argument=value
পুনর্বার পোস্ট

39
getopt(s)আপনি করতে পারেন এমন একটি জনপ্রিয় কমান্ড লাইন পার্সিং লাইব্রেরি (সাধারণত এমন কিছু বলা হয় ) ব্যবহার করুন।
পুনরায় পোস্টার

5
@ k3b আমরা Qt এর সাথে কাজ করছি। কেভিন ক্লাইন যেমন তাঁর মন্তব্যে বলেছেন আমরা ইতিমধ্যে উপলব্ধ গ্রন্থাগারটি ব্যবহার করতে পারি। আমি মনে করি এটি বহু-প্ল্যাটফর্ম এবং সুচিন্তিত। কিউকম্যান্ডলাইন পার্সার
ফিলিপ হাজুবস্কি

11
আপনার চূড়ান্ত ঝাপটায় সমস্যা হ'ল আর্গুমেন্ট পার্সিং কোনও প্ল্যাটফর্ম-স্বাধীন সমস্যা নয়।
পাইডসাইনার

উত্তর:


237

পসিক্স সিস্টেমে (যেমন লিনাক্স, ম্যাকোএসএক্স) কমপক্ষে শেল টার্মিনাল (সম্ভবত তাদের বেশিরভাগ) প্রোগ্রামের জন্য আমি জিএনইউ কোডিং কনভেনশনগুলি (যা সাধারণ আর্গুমেন্টের নামও তালিকাভুক্ত করে) ব্যবহার করার পরামর্শ দিচ্ছি এবং পসিক্স ইউটিলিটি গাইডলাইনগুলি সন্ধান করব এমনকি মালিকানা সফ্টওয়্যার জন্য:

  • সর্বদা হ্যান্ডেল --versionএবং--help (এমনকি /bin/trueতাদের গ্রহণ করে !!)। আমি অভিশাপ সফ্টওয়্যার লেখক বুঝতে না পারা --help, আমি তাদের ঘৃণা (কারণ prog --help হয় প্রথম কমান্ড আমি একটি নতুন প্রোগ্রাম চেষ্টা করছি)! প্রায়শই --helpসংক্ষিপ্তসার হিসাবে বলা যেতে পারে-h

  • মেসেজটিতে --helpসমস্ত বিকল্পের তালিকা রয়েছে (যদি না এগুলির মধ্যে অনেকগুলি থাকে ... তবে সেক্ষেত্রে সর্বাধিক সাধারণ তালিকাবদ্ধ করুন এবং স্পষ্টভাবে কিছু manপৃষ্ঠা বা কিছু ইউআরএল উল্লেখ করুন) এবং বিকল্পগুলির ডিফল্ট মান এবং সম্ভবত গুরুত্বপূর্ণ (এবং প্রোগ্রাম-নির্দিষ্ট) ) পরিবেশ পরিবর্তনশীল। বিকল্পের যুক্তি ত্রুটিতে এই বিকল্পগুলির তালিকা প্রদর্শন করুন।

  • গ্রহণ -aসংক্ষিপ্ত যুক্তি (একক অক্ষর) এবং কিছু সমতুল্য আছে --long-argument, তাই -a2 --long-argument=2, --long-argument 2; অবশ্যই আপনার কিছু --only-long-argumentনাম (খুব কম ব্যবহৃত বিকল্পগুলির জন্য) থাকতে পারে ; অতিরিক্ত বিকল্প ছাড়া মডেল যুক্তিগুলির -cfজন্য সাধারণত হিসাবে পরিচালনা করা হয় -c -f, ইত্যাদি etc. তাই আপনার -argument:valueপ্রস্তাবটি অদ্ভুত, এবং আমি এটি করার পরামর্শ দিই না।

  • GLIBC getopt_long বা আরও ভাল ব্যবহার করুন (উদাঃ আরগপি_পারস , ওক্যামেলে এটির Argমডিউল , ...)

  • প্রায়শই -স্ট্যান্ডার্ড ইনপুট বা আউটপুট ব্যবহার করুন (আপনি যদি এটি না করতে পারেন তবে হ্যান্ডেল করুন /dev/stdinএবং /dev/stdoutএমনকী কয়েকটি অপারেটিং সিস্টেমে না থাকলেও)

  • অনুরূপ প্রোগ্রামগুলির বেশিরভাগ বিকল্প কনভেনশন পুনরায় ব্যবহার করে তাদের আচরণের অনুকরণ করুন; বিশেষত -nশুকনো রান (à লা make), -hসাহায্যের -vজন্য, ভার্বোসিটি ইত্যাদির জন্য ...

  • --বিকল্প এবং ফাইল বা অন্যান্য আর্গুমেন্টের মধ্যে বিভাজক হিসাবে ব্যবহার করুন

  • যদি আপনার প্রোগ্রামটি স্টিডিনেরisatty চেয়ে পরীক্ষার জন্য ব্যবহার করে তবে এটি একটি টার্মিনাল (এবং "ইন্টারেক্টিভ" আচরণ করুন সেই ক্ষেত্রে), যদি আপনার প্রোগ্রামটিতে জিইউআই ইন্টারফেস থাকে (এবং এক্স 11 ডেস্কটপে পরীক্ষা ) থাকে তবে একইভাবে যদি অ ইন্টারেক্টিভ মোডকে জোর করার জন্য একটি বিকল্প সরবরাহ করে তবে তাও পারে ব্যাচ বা কমান্ড লাইনে ব্যবহার করুন।getenv("DISPLAY")

  • কিছু প্রোগ্রাম (উদাহরণস্বরূপ gcc) অপ্রত্যক্ষ যুক্তির তালিকাগুলি গ্রহণ করে, এর @somefile.txtঅর্থ হল প্রোগ্রাম আর্গুমেন্টগুলি পড়ুন somefile.txt; এটি কার্যকর হতে পারে যখন আপনার প্রোগ্রামটি খুব বড় প্রচুর আর্গুমেন্ট গ্রহণ করতে পারে (আপনার কর্নেলের চেয়ে বেশি ARG_MAX)

বিটিডাব্লু, আপনি এমনকি আপনার প্রোগ্রাম এবং সাধারণ শেলগুলির জন্য কিছু স্বয়ংক্রিয়-সম্পূর্ণ সুবিধা যুক্ত করতে পারেন (যেমন bashবা zsh)

কিছু পুরানো ইউনিক্স কমান্ডের (যেমন dd, বা এমনকি sed) historicalতিহাসিক সামঞ্জস্যের জন্য অদ্ভুত কমান্ড যুক্তি রয়েছে। আমি তাদের খারাপ অভ্যাসগুলি অনুসরণ না করার সুপারিশ করব (যদি না আপনি সেগুলির থেকে আরও ভাল রূপ তৈরি করেন)।

যদি আপনার সফ্টওয়্যার সম্পর্কিত কমান্ড-লাইন প্রোগ্রামগুলির একটি সিরিজ হয়, গিট থেকে অনুপ্রেরণা নিন (যা আপনি অবশ্যই একটি বিকাশের সরঞ্জাম হিসাবে ব্যবহার করেন), যা গ্রহণ করে git helpএবং git --helpঅনেকগুলি gitsubcommandএবংgitsubcommand--help

বিরল ক্ষেত্রে আপনার কাছে ব্যবহার হতে পারে argv[0](আপনার প্রোগ্রামের উপর symlinks ব্যবহার করে), যেমন bashপ্রার্থনা হিসাবে rbashএকটি ভিন্ন আচরণ (হয়েছে সীমাবদ্ধ শেল)। তবে আমি সাধারণত এটি করার পরামর্শ দিই না; এটা জানার জন্য পারে আপনার প্রোগ্রাম ব্যবহার করে একটি স্ক্রিপ্ট দোভাষী হিসেবে ব্যবহার করা যেতে পারে যদি কুঁড়েঘর অর্থাত #!প্রথম লাইন ব্যাখ্যা উপর execve (2) । আপনি যদি এই জাতীয় কৌশলগুলি করেন তবে --helpবার্তাগুলি সহ সেগুলি নথিভুক্ত করতে ভুলবেন না ।

মনে রাখবেন যে POSIX উপর শেল হয় globbing আর্গুমেন্টগুলি ( সামনে আপনার প্রোগ্রাম চলমান!), তাই (যেমন অক্ষর প্রয়োজন এড়াতে *বা $বা ~) অপশন যা শেল-পলান হতে হবে হবে।

কিছু ক্ষেত্রে, আপনি আপনার সফ্টওয়্যারটিতে জিএনইউ গিল বা লুয়ার মতো একটি অনুবাদক এম্বেড করতে পারেন ( আপনি যদি প্রোগ্রামিং ভাষায় দক্ষ না হন তবে আপনার নিজের টিউরিং-সম্পূর্ণ স্ক্রিপ্টিং ভাষার উদ্ভাবন এড়াতে পারেন)। এটি আপনার সফ্টওয়্যারটির ডিজাইনের উপর গভীর পরিণতি ঘটায় (তাই তাড়াতাড়ি চিন্তা করা উচিত!)। তারপরে আপনার সহজেই সেই অনুবাদকের কাছে কিছু স্ক্রিপ্ট বা কিছু অভিব্যক্তি পাস করতে সক্ষম হওয়া উচিত। যদি আপনি এই আকর্ষণীয় পদ্ধতির অবলম্বন করেন তবে আপনার সফ্টওয়্যার এবং এর ব্যাখ্যাযুক্ত আদিম যত্নের সাথে ডিজাইন করুন; আপনার জিনিসটির জন্য আপনার কিছু অদ্ভুত ব্যবহারকারী কোডিং বড় স্ক্রিপ্ট থাকতে পারে।

অন্যান্য ক্ষেত্রে, আপনি আপনার উন্নত ব্যবহারকারীদের তাদের সফ্টওয়্যারটিতে তাদের প্লাগইনটি লোড করতে দিতে চান ( ডায়নামিক লোডিং কৌশলগুলি ল্যা dlopenএবং ব্যবহার করে dlsym)। আবার এটি একটি অত্যন্ত গুরুত্বপূর্ণ ডিজাইনের সিদ্ধান্ত (সুতরাং যত্ন সহকারে প্লাগইন ইন্টারফেসটি সংজ্ঞায়িত করুন এবং নথি করুন) এবং আপনাকে এই প্লাগইনগুলিতে প্রোগ্রামের বিকল্পগুলি পাস করার জন্য একটি কনভেনশন সংজ্ঞায়িত করতে হবে।

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


লক্ষ্য করুন যে এটি /optionএকটি উইন্ডোজ বা ভিএমএস জিনিস। এটি পসিক্স সিস্টেমে উন্মাদ হবে (কারণ ফাইল স্তরক্রমটি /ডিরেক্টরি সেপ্রেটর হিসাবে ব্যবহার করে এবং শেলটি বিশ্বজুড়ে করে বলে)। আমার সমস্ত উত্তর বেশিরভাগই লিনাক্স (এবং পসিক্স) এর জন্য।


PS যদি সম্ভব হয় তবে আপনার প্রোগ্রামটিকে একটি ফ্রি সফটওয়্যার করুন , আপনি কিছু ব্যবহারকারী এবং বিকাশকারীদের কাছ থেকে উন্নতি পাবেন (এবং একটি নতুন প্রোগ্রাম বিকল্প যুক্ত করা একটি বিদ্যমান ফ্রি সফ্টওয়্যারটিতে যুক্ত করার জন্য প্রায়শই সহজ জিনিসগুলির মধ্যে একটি)। এছাড়াও, আপনার প্রশ্নটি উদ্দিষ্ট দর্শকদের উপর অনেকটা নির্ভর করে : কিশোর-কিশোরীদের জন্য খেলা বা ঠাকুরমার জন্য একটি ব্রাউজার সম্ভবত সংকলকের চেয়ে একই ধরণের এবং বিকল্পগুলির প্রয়োজন হয় না, বা ডেটাসেন্টার সিসাদমিনগুলির জন্য একটি নেটওয়ার্ক পরিদর্শক, বা মাইক্রোপ্রসেসরের জন্য একটি সিএডি সফ্টওয়্যার প্রয়োজন হয় না teenage স্থপতি বা ব্রিজ ডিজাইনারদের জন্য। প্রোগ্রামিং এবং স্ক্রিপ্টিংয়ের সাথে পরিচিত কোনও প্রকৌশলী সম্ভবত আপনার ঠাকুমার চেয়ে অনেক বেশি উপযুক্ত বিকল্প পছন্দ করতে পারে এবং সম্ভবত এক্স 11 (সম্ভবত কোনও crontabচাকরিতে) ছাড়াই আপনার অ্যাপ্লিকেশনটি চালাতে সক্ষম হতে পারে want


18
সম্মত, তবে git এটি একটি আরও ভাল উদাহরণ। আমি এমনকি সুপারিশ করা হবে না খুঁজছি মধ্যে cvsমধ্যে 2016.
বাসিল Starynkevitch

8
+ অবৈধ বিকল্পের ক্ষেত্রে কেবল সহায়তা প্রদর্শন করুন। উদাহরণস্বরূপ একটি অকেজো ত্রুটি বার্তা পেতে এটি SOOOO বিরক্তিকর dd -h
ডোমেন

8
জিএনইউ প্রোগ্রামগুলি --helpএকটি নিয়ম হিসাবে সমর্থন করে তবে প্রায়শই চিনে না -hযে কোনটি বিরক্তিকর। আমি সাধারণত -h টাইপ করি যখন আমি কোনও প্রোগ্রামের কোনও বিকল্প ভুলে যাই, দীর্ঘতর বিকল্পের সাহায্যে কমান্ডটি পুনরায় টাইপ করা বিরক্ত হয় --help। সর্বোপরি, আমি টাইপ করেছি - কারণ আমি কিছু ভুলে গেছি। ব্যবহারকারীর মনে রাখা কেন আশা করা উচিত যে কোন অগ্রগতির জন্য '--help' প্রয়োজন এবং কোন প্রোগ্রামগুলিতে সহায়তা স্ক্রিনটি দেখানোর জন্য '-h' প্রয়োজন? -H এবং --help উভয়ের জন্য কেবল একটি বিকল্প অন্তর্ভুক্ত করুন।
ব্র্যান্ডিন

30
এই উত্তরের প্রথম অংশটি ভাল তবে আপনি কোথাও কোথাও স্পর্শকাতর বন্ধ রয়েছে। উদাহরণস্বরূপ, কনফিগারেশন ফাইল, প্লাগইন এবং ড্লোপেন, সফ্টওয়্যার লাইসেন্স এবং ওয়েব ব্রাউজারগুলির পছন্দগুলি এখন কোনও কমান্ড লাইন ইন্টারফেসের কনভেনশনগুলির সাথে সম্পর্কিত নয়।
ব্র্যান্ডিন 13

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

68

একটি ডেটা ফর্ম্যাট কনভেনশন জনপ্রিয় তা হ'ল সুবিধা।

আপনি সহজেই দেখতে পাচ্ছেন যে = বা: বা এমনকি '' বিভাজক হিসাবে ব্যবহার করা তুচ্ছ পার্থক্য যা সামান্য চেষ্টা করে কম্পিউটারের মাধ্যমে একে অপরে রূপান্তরিত হতে পারে। একজন মানুষের মনে রাখার জন্য একটি বড় প্রচেষ্টা কী হবে "এখন দেখুন, এই অবিচলিতভাবে ব্যবহৃত প্রোগ্রামটি কি জিনিসগুলির সাথে :বা এর সাথে সীমানা ফেলেছিল =? হুঁ ..."

অন্য কথায়, godশ্বরের প্রতি ভালবাসার জন্য, বাধ্যবাধকতা ছাড়াই চূড়ান্তভাবে জড়িত সম্মেলন থেকে সরে যাবেন না। লোকেরা আপনার প্রোগ্রামটিকে "আমার কলেজের প্রবন্ধটি সংরক্ষণ করেছিলাম" এর পরিবর্তে "অদ্ভুত এবং বিরক্তিকর সেমিডলাইন সিনট্যাক্স সহ একটি" হিসাবে মনে রাখবে।


19
প্রায় সকল ভাষার জন্য কমান্ড লাইন আর্গুমেন্টগুলি পরিচালনা করার জন্য লাইব্রেরি ফাংশন রয়েছে। এর মধ্যে একটি ব্যবহার করুন।
কেভিন

9
ভাল পরামর্শ, কিন্তু এই সম্মেলনগুলি কি কি? -1
রাবারডাক

14
একটি সাধারণভাবে ব্যবহৃত ইউনিক্স সরঞ্জামের একটি আকর্ষণীয় উদাহরণ রয়েছে যা ইচ্ছাকৃতভাবে এই কনভেনশনটিকে লঙ্ঘন করে: ddএকটি key=valueবাক্য গঠন ব্যবহার করে। এই নকশার সিদ্ধান্তের কারণ হ'ল এই সরঞ্জামটি (ডাক নাম: ডি আটা ডি ইস্ট্রোয়ার) ভুলভাবে ব্যবহার করা হলে প্রচুর ক্ষতি করতে পারে। ব্যবহারকারীকে তাদের স্বাভাবিক অভ্যাস ত্যাগ করতে বাধ্য করে তারা ব্যবহারকারীরা কী করছে সে সম্পর্কে আরও ঘনিষ্ঠভাবে চিন্তা করতে বাধ্য করে।
ফিলিপ

18
আপনি কি নিশ্চিত যে এটি কারণ dd? আমি বিশ্বাস করি যে এটি যখন কেবল কার্নেলের এআরজি_ম্যাক্স ছোট ছিল তখন শেলগুলির কোনও স্বয়ং-পরিপূর্ণতা ছিল --long-argumentsনা এবং অস্তিত্ব ছিল না এমন সময়ে (১৯ 1970০?) কোড করা হয়েছিল । তারপরে আরও ভালভাবে ddপিছনে সামঞ্জস্য বজায় রেখেছিল
বেসাইল স্টারিনকিভিচ

9
ddঅন্য একটি ওএস (ইউএনআইএক্সের চেয়ে) থেকে উদ্ভূত হয়েছে - আইবিএমের ওএস / 360 এ একটি স্ক্রিপ্টিং-ল্যাঙ্গুয়েজ (জেসিএল) - যেখানে কনভেনশনগুলি আলাদা ছিল, ইউএনআইএক্স-তে কম-বেশি অপরিবর্তিত হওয়ার আগে - সম্ভবত এটি ব্যবহার করার সম্ভাব্য লোকেরা এটিকে জানতেন পূর্ববর্তী সিস্টেম
বার্ড কোপ্পেরুদ

29

সাধারণ লোকের ভাষায়

যেখানে যেমন, সেখানে তেমন.

  • যদি আপনার সিএলআই অ্যাপ্লিকেশনটি লিনাক্স / ইউনিক্সের উদ্দেশ্যে হয় -p valueবা --parameter valueকনভেনশনটি ব্যবহার করে । লিনাক্সে সহজেই এই জাতীয় পরামিতি এবং পতাকা বিশ্লেষণের জন্য সরঞ্জাম রয়েছে।

আমি সাধারণত এটির মতো কিছু করি:

while [[ $# > 0 ]]
do
key="$1"
case $key in
    --dummy)
    #this is a flag do something here
    ;;
    --audit_sessiones)
    #this is a flag do something here
    ;;
    --destination_path)
    # this is a key-value parameter
    # the value is always in $2 , 
    # you must shift to skip over for the next iteration
    path=$2
    shift
    ;;
    *)
    # unknown option
    ;;
esac
shift
done
  • যদি আপনার সিএলআই অ্যাপ্লিকেশনটি উইন্ডোজের উদ্দেশ্যে করা হয়, তবে ব্যবহার করুন /flagএবং /flag:valueকনভেনশন করুন।

  • ওরাকল এর মতো কিছু অ্যাপ্লিকেশন যদিও ব্যবহার করে না। ওরাকল ইউটিলিটি ব্যবহার PARAMETER=VALUE

  • একটি জিনিস আমি করতে চাই তা হ'ল, কমান্ড লাইনে প্যারামিটারগুলি গ্রহণ করার সাথে সাথে একটি প্যারাফিল ব্যবহারের বিকল্প সরবরাহ করা যা দীর্ঘ প্যারামিটার চেইনগুলি এড়ানোর জন্য একটি মূল-মান জুড়ি ফাইল। তার জন্য আপনার একটি অতিরিক্ত --parfile mifile.parপরামিতি সরবরাহ করা উচিত । স্পষ্টতই যদি --parfileএটি ব্যবহার করা হয় তবে অন্যান্য সমস্ত প্যারামিটারগুলি পারফিলের ভিতরে যা আছে তার পক্ষে ফেলে দেওয়া হবে are

  • একটি অতিরিক্ত পরামর্শ কিছু কাস্টম এনভায়রনমেন্ট ভেরিয়েবল ব্যবহারের অনুমতি দিচ্ছে , উদাহরণস্বরূপ, এনভায়রনমেন্ট ভেরিয়েবল MYAPP_WRKSPACE=/tmpসেট করা সবসময় সেট করা অপ্রয়োজনীয় করে তোলে --wrkspace /tmp

  • লিনাক্সে প্যারামিটার স্বয়ংক্রিয়ভাবে সমাপ্তি যুক্ত করতে ভুলবেন না , এর অর্থ ব্যবহারকারীরা অর্ধেক সুইচ টাইপ করতে পারেন, আঘাত করতে পারেন TABএবং তারপরে শেলটি তাদের জন্য এটি সম্পূর্ণ করবে।

1
ভাল, বেশ কয়েকটি জিএনইউ ইউটিলিটি (যেমন gcc) @mifile.parআপনার --parfile mifile.parপরামর্শ মত হ্যান্ডেল ।
বেসিল স্টারিনকিভিচ

7
যদি কোনও প্যারামিটার ফাইল থাকে তবে আপনি অন্য সমস্ত বিকল্প উপেক্ষা করার বিষয়ে নিশ্চিত? এটি আমার কাছে সবচেয়ে খারাপ বলে মনে হচ্ছে।
জোনাথন লেফলার

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

@ এল্ড্রিচচিৎ যে সি এল আই অ্যাপ্লিকেশনগুলিতে আমি লিখেছি, যখন কোনও পারফিল দেওয়া হয় তখন কোনও অ্যাডিশনাল প্যারামিটার একটি ত্রুটি তৈরি করে।
তুলিনস কর্ডোভা

1
যদি কোনও সক্ষম শেল ব্যবহার করে থাকেন তবে এই ধরণের "কনফিগার ফাইল প্যারামিটার" বিকল্পের প্রয়োজন নেই। যেমন আপনি শুধু লিখুন fooCmd -opt1 -opt2 $(cat more_options.opts)। সুতরাং আমি "কনফিগার ফাইল প্যারামিটার" বিকল্পটি আশা করব, যদি সরবরাহ করা হয় তবে মূলত একইভাবে কাজ করা উচিত।
ব্র্যান্ডিন

19

একটি জিনিস যা এখনও আসে নি:

কমান্ড লাইন আর্গুমেন্ট থেকে উপরের দিকে আপনার সফ্টওয়্যারটি ডিজাইন করার চেষ্টা করুন । অর্থ:

কার্যকারিতা ডিজাইনের আগে ব্যবহারকারী ইন্টারফেসটি ডিজাইন করুন।

এটি আপনাকে প্রারম্ভিক কেস এবং সাধারণ ক্ষেত্রে প্রথম দিকে ড্রিল করতে দেয়। অবশ্যই আপনি এখনও বাহ্যিক এবং অভ্যন্তর বিমূর্ত করতে পারেন, তবে এটি কেবলমাত্র সমস্ত কোড লিখে এবং তারপরে এটিতে একটি সিএলআইয়ের নিন্দা করার চেয়ে আরও ভাল ফলাফল দেয়।

তদ্ব্যতীত, ডকপ্ট ( http://docopt.org/ ) দেখুন।

ডকপট হ'ল এটি বেশ কয়েকটি ভাষায় বিশেষত অজগর জন্য যেখানে আপনার মারাত্মকভাবে সীমাবদ্ধ, আরগপার্সের মতো ব্যবহারকারী-প্রতিকূল যুক্তি পার্সার এখনও "ঠিক আছে" হিসাবে বিবেচিত হচ্ছে। পার্সার এবং সাবপারসার্স এবং শর্তসাপেক্ষিত ডিক্টস পরিবর্তে আপনি কেবল বাক্য গঠন সহায়তা সংজ্ঞায়িত করেন এবং এটি বাকীটি করে।


আমি এই উত্তরটি পছন্দ করি এবং এর জন্য আপনাকে ধন্যবাদ, কারণ আমি বর্তমানে argparseপ্রোগ্রামার, ব্যবহারকারী-ইন্টারফেস বা ব্যবহারকারীবান্ধব কেউ না হওয়ায় হতাশ ।
বিড়াল

আমি ডকপট চেষ্টা করেছি, এবং এটি আমার পছন্দ হয় না। অনেকগুলি ক্লিনার কোডে ফলাফলগুলি ক্লিক করুন , যদিও আপনার সাবকম্যান্ডগুলি রয়েছে যখন বিকল্পগুলির সাথে সামান্য হতাশাবোধ রয়েছে।
jpmc26

2
এটি অনেকটা বিজ্ঞাপনের মতো। উত্সটি প্রাসঙ্গিক হলে কেবল একবার উল্লেখ করুন .. তবে এটি এখন যেমন আছে আপনার উত্তরের ৫০% কেবল বাহ্যিক সংস্থান প্রচার করার মতো শোনাচ্ছে।
ব্র্যান্ডিন

আমি এটিকে 'প্রথমে ব্যবহারের মডেলটি ডিজাইন করুন' হিসাবে বলতে চাই। কার্যকারিতা থেকে ব্যবহারকারীর অভিজ্ঞতা পৃথক করা অনেক ক্ষেত্রে কৃত্রিম পার্থক্য হতে পারে (সরঞ্জামের সীমাবদ্ধতা ইন্টারফেসকে প্রভাবিত করে)।
তামার.শত

1
ডকপ্টের জন্য +1। এটি আমার সমস্ত সিএলআই দ্বিধা সমাধান করে, সম্পূর্ণ ব্যথা মুক্ত। কখনও কখনও সত্যিকারের উত্সাহ থেকে বিজ্ঞাপনটি বলা শক্ত, তবে এখানে এটি - আমি এখন বছরের পর বছর ধরে ডকপট উত্সাহী, কোনওভাবেই অনুমোদিত নয়;)
ফ্রি

3

ইতিমধ্যে কয়েকটি মূল্যবান মন্তব্য সরবরাহ করা হয়েছে (@ ফ্লোরিয়ান, বেসাইল), তবে আমাকে যুক্ত করা যাক ... ওপি বলে,

আমরা ডিভাইসগুলি পরিচালনা করতে ফ্রন্ট-এন্ড ইন্টারফেস সরবরাহ করব। তবে কিছু উন্নত প্রশাসক নিজেরাই অ্যাপ্লিকেশনটি কনফিগার করতে চাইতে পারেন

তবে মন্তব্য:

আমি চাইনি এই প্রশ্নটি প্ল্যাটফর্ম বা ভাষা নির্দিষ্ট হোক

আপনাকে অবশ্যই আপনার লক্ষ্যযুক্ত শ্রোতা - উন্নত প্রশাসক বিবেচনা করতে হবে । তারা সাধারণত কোন প্ল্যাটফর্মে কাজ করে - উইন / ইউনিক্স / ম্যাক? এবং আপনি কোন প্ল্যাটফর্মটি চালাচ্ছেন? সেই প্ল্যাটফর্মের জন্য ইতিমধ্যে যে কোনও সিএলআই কনভেনশন প্রতিষ্ঠিত হয়েছে তা অনুসরণ করুন। আপনার "উন্নত" প্রশাসকরা কি জিইউআই ভিত্তিক সরঞ্জাম চান / চান?

আপনি চান ইন্টারফেসটি অভ্যন্তরীণভাবে এবং অন্যান্য অ্যাডমিন সরঞ্জামগুলির সাথে সামঞ্জস্যপূর্ণ হোক। আমি থামতে চাই না এবং ভাবতে চাই এটি cmd -p <arg>বা cmd -p:<arg>বা cmd /p <arg>। আমার কি কোটসের দরকার আছে? আমি cmd -p <val1> <val2>বা cmd -p <val1> -p <val2>একাধিক লক্ষ্য জন্য? তারা নির্দিষ্ট আদেশ আছে? Overloadable? না cmd -p2 <arg> -p1 <arg>খুব কাজ করে? না ls -l -r -t dir1 dir2== ls -trl dir1 dir2?

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

সিএলআই ডিজাইনের মতো গুরুত্বপূর্ণ এটি হ'ল আপনার অ্যাপ্লিকেশনটি জিইউআইয়ের মতো কমান্ড লাইন আর্গুমেন্টের সাথে কাজ করার জন্য ডিজাইন করা হয়েছে - যেমন: জিইউআইতে কোনও ব্যবসায়িক যুক্তি বা জিইআইআই এবং সিআইএলআই উভয় পক্ষ থেকে আহ্বিত সাধারণ কমান্ড ব্যবহার করবেন না।

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

ক্লাসিক টুলসেট হিসাবে ডাব্লু / এই পদ্ধতির ব্যবহৃত হয় টিসিএল / টাকা । আপনাকে সরঞ্জামগুলি স্যুইচ করার পরামর্শ দিচ্ছে না; প্রথমে একটি কমান্ড লাইন সরঞ্জাম হিসাবে অ্যাপ্লিকেশনটিতে জিইউআই ভিত্তিক প্রশাসনিক অ্যাপ্লিকেশন লিখে ডিজাইনের পদ্ধতির বিষয়টি বিবেচনা করুন; তারপরে সুবিধার জন্য উপরে জিইউআই স্তর রাখুন। আপনি যদি একাধিক কনফিগার করতে এবং সাধারণত একই বিকল্পগুলি বারবার প্রবেশ করতে হয় এবং আপনি একটি স্বয়ংক্রিয় পদ্ধতির সন্ধান করতে পারেন তবে আপনি সম্ভবত জিইউআইয়ের ব্যথা আবিষ্কার করবেন and

মনে রাখবেন আপনার অ্যাডমিনকে সম্ভবত সঠিক বাক্সগুলিতে সঠিক মানগুলি টাইপ করতে হবে, সুতরাং আপনি ডাব্লু / জিইউআই কতটা উপশম করছেন?


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