विकल्प और मापदंडों के बीच रिक्त स्थान क्यों छोड़ा जा सकता है?


16

उदाहरण के लिए:

xargs -n 1

के समान है

xargs -n1

लेकिन अगर आप मैन पेज को देखते हैं , तो विकल्प को सूचीबद्ध किया गया है -n max-args, जिसका अर्थ है कि अंतरिक्ष को संरक्षित किया जाना चाहिए। संक्षिप्त रूप-एन -मैक्स-आर्ग्स के बारे में कुछ भी नहीं है ।

यह कई अन्य लिनक्स उपयोगिताओं के साथ भी होता है।

इसे लिनक्स में क्या कहा जाता है? क्या सभी उपयोगिताओं संक्षिप्त रूप का समर्थन करती हैं (लेकिन मैन पेज में इसे कभी भी दस्तावेज़ नहीं करें)?


1
12.1.2.a इतिहास में से कुछ है; मैं कसम खाता हूँ कि इस बारे में यहाँ पहले से ही एक अच्छा सवाल है, लेकिन मुझे यह अभी तक नहीं मिला है।

2
@drewbenn आप जिस अन्य प्रश्न के बारे में सोच रहे हैं, वह मेरा हो सकता है: 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

संपादित करें :

उपयोगिताएँ C कॉल getopt()(घोषित unistd.h) में लिखी गई हैं जो उसी तरह से काम करती हैं। वास्तव में, हम सभी जानते हैं, bashफ़ंक्शन getoptsको सी लाइब्रेरी फ़ंक्शन के लिए कॉल का उपयोग करके लागू किया जा सकता है getopt()। पर्ल, पायथन और अन्य भाषाओं में समान कमांड लाइन पार्सिंग लाइब्रेरी हैं, और यह सबसे अधिक संभावना है कि वे इसी तरह से अपने पार्सिंग का प्रदर्शन करते हैं।

इनमें से कुछ getoptऔर समान getoptपुस्तकालय दिनचर्या "लंबे" विकल्प भी संभालती है। ये आमतौर पर डबल-डैश ( --) से पहले होते हैं , और लंबे विकल्प जो तर्क लेते हैं वे अक्सर एक समान संकेत के बाद ऐसा करते हैं, उदाहरण के --block-size=SIZEलिए duउपयोगिता [] के कुछ कार्यान्वयन (जो -B SIZEएक ही चीज़ को निर्दिष्ट करने की भी अनुमति देता है) का विकल्प।

कारण मैनुअल अक्सर छोटे विकल्पों के बीच एक स्थान दिखाने के लिए लिखे जाते हैं और उनके तर्क शायद पठनीयता के लिए होते हैं।

संपादित करें : वास्तव में पुराने उपकरण, जैसे ddऔर tarउपयोगिताओं, उनके सामने डैश के बिना विकल्प हैं। यह विशुद्ध रूप से ऐतिहासिक कारणों से और सॉफ्टवेयर के साथ संगतता बनाए रखने के लिए है जो उन पर निर्भर करता है कि वे ठीक उसी तरह से काम करें। tarउपयोगिता अधिक हाल के दिनों में डैश से विकल्प लेने की क्षमता हासिल की है। बीएसडी मैनुअल tar"बंडल किए गए झंडे" के लिए पुराने शैली के विकल्प कहता है।


यह फीचर बैश स्क्रिप्टिंग में लागू करना आसान लग सकता है। लेकिन मुझे लगता है कि अधिकांश उपयोगिताओं को सी में लिखा जाता है (तब बायनेरिज़ को संकलित किया जाता है) बैश नहीं। ये सुविधाएं इस सुविधा को क्यों लागू करती हैं?
जे।

@ जे। जेओ क्योंकि वे कहते हैं getopt()(घोषित unistd.h), जो एक ही काम करता है।
Kusalananda

2
हां, आप सही हैं। संदर्भ । यह भी एक और रहस्य को हल करता है कि विकल्पों को जोड़ा जा सकता है -a -b=== -ab
जे।

1
झंडे के लिए वैकल्पिक तर्क एक अस्पष्टता पैदा करेंगे, इसलिए उन्हें संयोजित नहीं किया जा सकता है (यदि -aवैकल्पिक तर्क है, -abजैसा नहीं है -a -b)। गैर-ध्वज को पूरा करते समय GNU फ्लैगशिप को रोकना बंद नहीं करता है: इसके बजाय (डिफ़ॉल्ट रूप से), इसके बजाय यह फ्लैग को argv के सामने फेरबदल करता है।
इलकाचू

@ilkkachu उस स्पष्टीकरण के लिए धन्यवाद। मैं बाद में अपना जवाब अपडेट कर सकता हूं।
Kusalananda

4

xargsPOSIX उपयोगिताओं में से एक है। जैसा कि @drewbenn द्वारा टिप्पणी की गई, POSIX ने अपनी अधिकांश उपयोगिताओं के लिए विकल्प-पार्स व्यवहार का मिलान करने के getoptलिए, अन्य कार्यान्वयन के लिए कुछ भत्तों के साथ, 12.1 यूटिलिटी आर्ग्युमेंट सिंटैक्स में कहा :

यह खंड मानक उपयोगिताओं के तर्क सिंटैक्स का वर्णन करता है और उपयोगिताओं द्वारा संसाधित तर्कों का वर्णन करने के लिए POSIX.1-2008 में उपयोग की जाने वाली शब्दावली का परिचय देता है।

POSIX.1-2008 के भीतर, एक उपयोगिता के तर्कों के वाक्यविन्यास का वर्णन करने के लिए एक विशेष अंकन का उपयोग किया जाता है। जब तक अन्यथा उल्लेख नहीं किया जाता है , सभी उपयोगिता विवरण इस संकेतन का उपयोग करते हैं, जो इस उदाहरण से स्पष्ट होता है (XCU सरल कमांड देखें ):

और के साथ समापन

यह अनुशंसा की जाती है कि सभी भावी उपयोगिताओं और अनुप्रयोग उपयोगकर्ता पोर्टेबिलिटी को बढ़ाने के लिए इन दिशानिर्देशों का उपयोग करते हैं। यह तथ्य कि कुछ ऐतिहासिक उपयोगिताओं को बदला नहीं जा सकता है (मौजूदा अनुप्रयोगों को तोड़ने से बचने के लिए) इस भविष्य के लक्ष्य को नहीं रोकना चाहिए।

POSIX के भीतर (याद रखें कि यह केवल सबसे अधिक उपयोग की जाने वाली उपयोगिताओं को शामिल करता है), ऐसे अपवाद हैं जो ऑपरेंड पास करते हैं जो अन्य उपयोगिताओं में विकल्प के रूप में या तो स्थितीय पैरामीटर या विशेष सिंटैक्स वाले पैरामीटर होंगे :

POSIX वैकल्पिक विकल्प-मूल्यों के लिए अनुमति देता है :

विकल्प-तर्क को <blank>वर्णों द्वारा उनके विकल्पों से अलग करके दिखाया गया है, सिवाय इसके कि जब विकल्प-तर्क संलग्न हो '['और ']'यह इंगित करने के लिए कि यह वैकल्पिक है।

ऑफहैंड, मुझे याद नहीं है कि POSIX उपयोगिताओं में से कौन सी सुविधा का उपयोग करती है। Ncurses ticऔर infocmpउपयोगिताओं के लिए सुविधा का उपयोग के स्तर के -v(वर्बोज़ / डिबग) विकल्प।

जिस विशिष्ट बिंदु के बारे में आपने पूछा है, वह उस पैराग्राफ के शेष हिस्सों में विस्तृत है, जो कई लाइनों पर चल रहा है।

POSIX से पहले, psएक अग्रणी हाइफ़न के बिना स्वीकृत विकल्पों के कुछ कार्यान्वयन । POSIX विवरण में उल्लेख नहीं है कि उपयोगिता के विवरण में या वाक्यविन्यास तर्क में:

POSIX के अलावा, विकल्प के मूल्य को अलग करने या शामिल करने के लिए कई तरह के तरीकों का उपयोग करके लंबे समय के विकल्प कार्यान्वयन होते हैं (जैसे GNU getopt_long , या X टूलकिट )। उदाहरण के लिए, विराम चिह्न का उपयोग किया जा सकता है:

--option=value
--option value

कार्यान्वयन के आधार पर, एक डबल-डैश शॉर्ट (गेटॉप) से लंबे विकल्पों को अलग करने के लिए इस्तेमाल किया जा सकता है / नहीं किया जा सकता है: lynx और X Toolkit एकल डैश का उपयोग करते हैं; getopt_longउदाहरण के लिए, GNU एक डबल-डैश का उपयोग करता है। इसके अलावा, यह +इंगित करने के लिए इस्तेमाल किया जा सकता है कि एक विकल्प नकारात्मक है।

POSIX का वर्णन इनमें से किसी का भी उल्लेख नहीं करता है, लेकिन आप निश्चित रूप से उनका सामना करने की संभावना रखते हैं।


है -option=valueहोना चाहिए --option=value(लंबी विकल्प प्रारूप, एक के बजाय शुरुआत में दो डैश)?
J.Joe

कुछ विरासत उपयोगिताओं में एकल-डैश लंबे विकल्प (-ओपशन) का उपयोग किया जाता है, लेकिन वे नई स्क्रिप्ट और कार्यक्रमों के लिए बड़े पैमाने पर चित्रित किए जाते हैं। छोटे विकल्पों के लिए एकल-डैश का उपयोग करें, जैसे कि गेटअप द्वारा नियंत्रित किया जाता है। लगभग सभी नई स्क्रिप्ट और प्रोग्राम डबल-डैश लंबे विकल्पों का उपयोग करते हैं। कई भी सबसे अधिक इस्तेमाल किए जाने वाले लोगों के लिए सिंगल-डैश शॉर्ट ऑप्शन समकक्षों का समर्थन करते हैं। लंबे विकल्प स्क्रिप्ट कोड को अधिक स्व-दस्तावेजीकरण बनाते हैं, कम टिप्पणियों की आवश्यकता होती है।
डॉकस्लेवगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.