বিকল্প এবং পরামিতিগুলির মধ্যে শূন্যস্থানগুলি কেন বাদ দেওয়া যায়?


16

উদাহরণ স্বরূপ:

xargs -n 1

এটার মতই

xargs -n1

কিন্তু যদি আপনি তাকান man পৃষ্ঠা বিকল্পটি হিসেবে তালিকাভুক্ত করা হয় -n max-args, যার মানে স্থান সংরক্ষিত করা অনুমিত হয়। সংক্ষিপ্ত রূপটি -ম্যাক্স-আরগস সম্পর্কে কিছুই নেই ।

এটি অন্যান্য অনেক লিনাক্স ইউটিলিটিগুলির সাথেও ঘটে।

লিনাক্স এ কী বলা হয়? সমস্ত ইউটিলিটিগুলি সংক্ষিপ্ত আকারটি সমর্থন করে (তবে ম্যান পৃষ্ঠায় এটি কখনই দলিল করে না)?


1
12.1.2.a ইতিহাসের কিছু; আমি শপথ করছি এখানে ইতিমধ্যে এখানে একটি ভাল প্রশ্ন আছে তবে আমি এটি এখনও পাইনি।

2
@ ড্র্রুবেন অন্য প্রশ্নটির কথা আপনি ভাবছেন যা আমার হতে পারে: unix.stackexchange.com/q/188046/41515

উত্তর:


12

আপনি যখন আপনার কোডটির বিচ্ছিন্নতা কমান্ড লাইনটি লিখবেন তখন আপনি নির্দিষ্ট করবেন যে কোন বিকল্পগুলি আর্গুমেন্ট গ্রহণ করে এবং কোনটি গ্রহণ করে না। উদাহরণস্বরূপ, শেল স্ক্রিপ্টে কোনও -hবিকল্প গ্রহণ করা (উদাহরণস্বরূপ সহায়তার জন্য) এবং একটি -aবিকল্প যা আর্গুমেন্ট গ্রহণ করা উচিত, আপনি তা করেন

opt_h=0     # default value
opt_a=""

while getopts 'a:h' opt; do
    case $opt in
        h)  opt_h=1 ;;
        a)  opt_a="$OPTARG" ;;
    esac
done

echo "h: $opt_h"
echo "a: $opt_a"

a:hবিট বলে "আমি দুটি বিকল্প বিশ্লেষণ করতে আশা করছি, -aএবং -h, এবং -aএকটি আর্গুমেন্ট গ্রহণ করা উচিত" (এটা হচ্ছে :পরে aযে পার্সার যে বলে-a একটি আর্গুমেন্ট গ্রহণ করা)।

অতএব, কোনও বিকল্প যেখানে শেষ হয়, কোথায় এর মান শুরু হয় এবং যেখানে এর পরে আর একটি শুরু হয় সেখানে কোনও অস্পষ্টতা থাকে না।

এটি চালানো:

$ bash test.sh -h -a hello
h: 1
a: hello

$ bash test.sh -h -ahello
h: 1
a: hello

$ bash test.sh -hahello
h: 1
a: hello

এজন্য আপনার বেশিরভাগ সময় আপনার নিজের কমান্ড লাইন পার্সার বিকল্পগুলি পার্স করতে লিখবেন না।

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

$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello

নিম্নলিখিত সমাধান করে যে:

$ bash test.sh -a hello -- -world
h: 0
a: hello

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

এটি হ'ল উপায় দ্বারা, আপনি কীভাবে কোনও ফাইলটির অপসারণের সাথে তার ফাইলটির নাম শুরু করার সাথে ড্যাশ রয়েছে rm

সম্পাদনা :

সি কলে লিখিত ইউটিলিটিস getopt()(ঘোষিত unistd.h) যা প্রায় একইভাবে কাজ করে। আসলে, আমরা সবাই জানি, সি লাইব্রেরি ফাংশনে একটি কল ব্যবহার করে bashফাংশনটি getoptsপ্রয়োগ করা যেতে পারেgetopt() । পার্ল, পাইথন এবং অন্যান্য ভাষায় একই কমান্ড লাইনের লাইব্রেরি পার্সিং রয়েছে এবং সম্ভবত তারা একইভাবে তাদের পার্সিং সম্পাদন করে।

এর মতো getoptএবং getoptলাইব্রেরির কয়েকটি রুটিন "দীর্ঘ" বিকল্পগুলিও পরিচালনা করে। এগুলি সাধারণত ডাবল-ড্যাশ ( --) এর আগে হয় এবং দীর্ঘ বিকল্পগুলি আর্গুমেন্টগুলি নিয়ে প্রায়শই সমান চিহ্নের পরে এটি করে, উদাহরণস্বরূপ ইউটিলিটির --block-size=SIZE[কিছু বাস্তবায়নের] বিকল্প du(যা এটির জন্যও অনুমতি দেয়)-B SIZE একই জিনিসটি নির্দিষ্ট করার )।

ম্যানুয়ালগুলি প্রায়শই সংক্ষিপ্ত বিকল্পগুলির মধ্যে একটি স্থান দেখানোর জন্য এবং তাদের যুক্তিগুলি সম্ভবত পাঠযোগ্যতার জন্য রচনা করা হয়।

সম্পাদনা : সত্যিই যেমন পুরাতন সরঞ্জাম, ddএবং tarইউটিলিটিগুলি, তাদের সামনে ড্যাশ ছাড়া বিকল্প ব্যবহার করতে পারেন। এটি নিখুঁত reasonsতিহাসিক কারণে এবং সফ্টওয়্যারটির সাথে সামঞ্জস্যতা বজায় রাখার জন্য যা তাদের ঠিক সেই পথে কাজ করতে নির্ভর করে। tarউপযোগ আরো সাম্প্রতিক সময়ে ড্যাশ সঙ্গে অপশন নেওয়ার ক্ষমতা অর্জন করেছে। BSD ম্যানুয়ালটি tar"বান্ডেলযুক্ত পতাকা" জন্য পুরানো শৈলীর বিকল্পগুলিকে কল করে।


এই বৈশিষ্ট্যটি ব্যাশ স্ক্রিপ্টিংয়ে প্রয়োগ করা সহজ বলে মনে হচ্ছে। তবে আমি মনে করি বেশিরভাগ ইউটিলিটিগুলি সিতে লেখা আছে (তারপরে বাইনারিগুলিতে সংকলিত) বাশ নয়। কেন এই ইউটিলিটিগুলি এই বৈশিষ্ট্যটি বাস্তবায়ন করে?
জে জে

@ জে.জয় কারণ তারা কল করে getopt()(ঘোষিত unistd.h), যা একই কাজ করে।
কুসালানন্দ

2
হ্যাঁ, আপনি ঠিক বলেছেন। রেফারেন্স । এটি অপর এক -a -b-ab
রহস্যও

1
পতাকাগুলির জন্য alচ্ছিক আর্গুমেন্টগুলি দ্বিধাগ্রস্থতা তৈরি করবে, সুতরাং সেগুলি একত্রিত করা যায় না (যদি -aargumentচ্ছিক যুক্তি থাকে -abতবে একই নয় -a -b)। জিএনইউ গিওপ্ট একটি পতাকাবিহীন বৈঠকের সময় পতাকা প্রসেসিং বন্ধ করে না: পরিবর্তে (ডিফল্টরূপে), পরিবর্তে এটি পতাকাগুলি আরজিভের সামনের দিকে রদবদল করে।
ilkkachu

@ ইলক্কাচু সেই স্পষ্টির জন্য ধন্যবাদ। আমি আমার উত্তরটি পরে আপডেট করতে পারি।
কুসালানন্দ

4

xargsপসিক্স ইউটিলিটিগুলির মধ্যে একটি। @ ড্রেউবেনের মন্তব্য অনুসারে, পসিক্স তার বেশিরভাগ ইউটিলিটিগুলির সাথে মেলে রাখার জন্য বিকল্প-পার্সিং আচরণের নথি করেছে getopt, অন্যান্য বাস্তবায়নের জন্য কিছু ভাতা দিয়ে বলেছে, 12.1 ইউটিলিটি আর্গুমেন্ট সিনট্যাক্সে :

এই বিভাগটি স্ট্যান্ডার্ড ইউটিলিটিগুলির আর্গুমেন্ট সিনট্যাক্স বর্ণনা করে এবং ইউটিলিটিগুলি দ্বারা প্রক্রিয়া করা আর্গুমেন্টগুলি বর্ণনা করার জন্য POSIX.1-2-2008 জুড়ে ব্যবহৃত পরিভাষাগুলির পরিচয় দেয়।

POSIX.1-2-2008 এর মধ্যে, কোনও ইউটিলিটির আর্গুমেন্টের বাক্য গঠন বর্ণনা করার জন্য একটি বিশেষ স্বরলিপি ব্যবহার করা হয়। অন্যথায় উল্লিখিত না হওয়া পর্যন্ত সমস্ত ইউটিলিটি বিবরণ এই নোটেশনটি ব্যবহার করে, যা এই উদাহরণ দ্বারা চিত্রিত হয়েছে (এক্সসিইউ সিম্পল কমান্ড দেখুন ):

এবং সমাপ্তি সঙ্গে

ভবিষ্যতের সমস্ত ইউটিলিটি এবং অ্যাপ্লিকেশনগুলি ব্যবহারের বহনযোগ্যতা বাড়ানোর জন্য এই নির্দেশিকাগুলি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। কিছু historicalতিহাসিক ইউটিলিটিগুলি পরিবর্তন করা যায়নি (বিদ্যমান অ্যাপ্লিকেশনগুলি ভঙ্গ করা এড়াতে) এই ভবিষ্যতের লক্ষ্যটিকে প্রতিহত করা উচিত নয়।

POSIX মধ্যে (মনে রাখবেন যে এটি শুধুমাত্র সবচেয়ে বেশি ব্যবহৃত ইউটিলিটি জুড়ে), সেখানে ব্যতিক্রম যা operands যা হবে পাস হয় অপশন পারেন হিসাবে অন্যান্য ইউটিলিটি মধ্যে অবস্থানগত সঙ্গে পরামিতি, অথবা পরামিতি বিশেষ সিনট্যাক্স :

POSIX জন্য করতে পারবেন ঐচ্ছিক বিকল্প-মান:

অপশন-আর্গুমেন্টগুলি <blank>অক্ষর দ্বারা তাদের বিকল্পগুলি থেকে পৃথক দেখানো হয়েছে , যখন বিকল্প-যুক্তিটি the চ্ছিক '['এবং ']'ইঙ্গিতটি চিহ্নিত করার জন্য স্বরলিখনের মধ্যে আবদ্ধ থাকে except

অফহ্যান্ড, আমি কোন পসিক্স ইউটিলিটিগুলি বৈশিষ্ট্যটি ব্যবহার করে তা মনে করি না। Ncurses ticএবং infocmpইউটিলিটিগুলি স্তরের স্তরের জন্য বৈশিষ্ট্যটি ব্যবহার করে-v (বাগাড়ম্বরপূর্ণ / ডিবাগ) বিকল্প।

আপনি যে নির্দিষ্ট পয়েন্টটির বিষয়ে জিজ্ঞাসা করেছেন তা সেই অনুচ্ছেদের বাকী অংশে কয়েকটি পংক্তিতে বিশদভাবে বিশদ রয়েছে।

পসিক্সের আগে, psঅগ্রণী হাইফেন ছাড়াই গ্রহণযোগ্য বিকল্পগুলির কিছু বাস্তবায়ন । পসিক্স বর্ণনাটিতে ইউটিলিটির বর্ণনায় বা সিনট্যাক্স যুক্তিতে উল্লেখ করা হয়নি:

পসিক্সকে বাদ দিয়ে , বিকল্প-বিকল্পের বিকল্পের মানটির সাথে পৃথক বা যোগদানের বিভিন্ন উপায় ব্যবহার করে দীর্ঘ-বিকল্প বাস্তবায়ন রয়েছে (যেমন জিএনইউ getopt_long , বা এক্স টুলকিট )। উদাহরণস্বরূপ, যতিচিহ্ন ব্যবহার করা যেতে পারে:

--option=value
--option value

বাস্তবায়ন উপর ভিত্তি করে, একটি ডাবল ড্যাশ / সংক্ষিপ্ত (getopt) থেকে দীর্ঘ অপশন পার্থক্য করার জন্য ব্যবহার করা যেতে পারে না: Lynx এবং এক্স Toolkit একটি একক ড্যাশ ব্যবহার; getopt_longউদাহরণস্বরূপ, জিএনইউ একটি ডাবল ড্যাশ ব্যবহার করে। এছাড়াও, একটি +বিকল্পটিকে অবহেলা করা হয়েছে তা বোঝাতে একটি ব্যবহার করা যেতে পারে।

পসিকসের বর্ণনায় এর কোনও উল্লেখ পাওয়া যায় না, তবে আপনি সম্ভবত এগুলির মুখোমুখি হতে পারেন।


থাকার -option=valueকথা --option=value? (দীর্ঘ-বিকল্পের ফর্ম্যাট, একের পরিবর্তে শুরুতে দুটি ড্যাশ)
জে.জাই

কয়েকটি লিগ্যাসি ইউটিলিটিগুলি একক-ড্যাশ দীর্ঘ বিকল্পগুলি ব্যবহার করে (-শক্তি) তবে এগুলি নতুন স্ক্রিপ্ট এবং প্রোগ্রামগুলির জন্য মূলত অবচিত করা হয়। গোটপট দ্বারা পরিচালিত সংক্ষিপ্ত বিকল্পগুলির জন্য একটি একক-ড্যাশ ব্যবহার করুন। প্রায় সব নতুন স্ক্রিপ্ট এবং প্রোগ্রাম ডাবল ড্যাশ দীর্ঘ বিকল্প ব্যবহার করে। অনেকগুলি সর্বাধিক ব্যবহৃত ব্যবহৃতগুলির জন্য একক-ড্যাশ সংক্ষিপ্ত বিকল্পের সমতুল্য সমর্থন করে। দীর্ঘ বিকল্পগুলি স্ক্রিপ্ট কোডটিকে আরও বেশি স্ব-ডকুমেন্টিং করে তোলে, কম মন্তব্যের প্রয়োজন হয়।
ডকসালভেজার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.