एकल-वर्ण विकल्पों के लिए एकल डैश `-`, लेकिन शब्दों के लिए डबल डैश` - `?


51

शब्दों के लिए अक्षरों और डबल्स के लिए एकल डैश का उपयोग करने का सम्मेलन कहां से आया और इसका उपयोग क्यों जारी है?

उदाहरण के लिए यदि मैं टाइप करता हूं ls --help, तो आप देखते हैं:

  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      use SIZE-byte blocks
  -B, --ignore-backups       do not list implied entries ending with ~
...

मैंने - and -- conventionथोड़ी सफलता के साथ उद्धरणों के साथ भी गुगली करने की कोशिश की ।


6
यहां सिर्फ नाइट-पिकी है, लेकिन चरित्र -को तकनीकी रूप से हाइफन कहा जाता है । हम ज्यादातर मामलों में, डैश (-) और कभी-कभी एन डैश (-) का उल्लेख करने के लिए "डैश" शब्द का उपयोग करते हैं, लेकिन इनमें से कोई भी हाइफ़न (-) नहीं है।
छरवे

4
यह वास्तव में मुझे गुस्सा दिलाता है जब अच्छी तरह से ज्ञात कार्यक्रम सम्मेलन का पालन नहीं करते हैं, हालांकि:java -version
किम्बर्ली डब्ल्यू

4
@ जमील हाँ। मैं यह सोचकर यहाँ समाप्त हुआ कि यह क्यों हैfind . -delete
क्रिज़्सटॉफ़ वेंडे

इस के विचार तो यह है कि आप चीजों की तरह लिख सकते हैं -abजो दोनों को सक्रिय करता है aऔर b। डबल डैश के बिना, -helpको सक्रिय कर h, e, l, और pविकल्प।
आरोन फ्रेंके

जवाबों:


61

में यूनिक्स प्रोग्रामिंग की कला एरिक स्टीवन रेमंड वर्णन करता है कि इस अभ्यास विकसित:

मूल यूनिक्स परंपरा में, कमांड-लाइन विकल्प एकल हाइफ़न से पहले के एकल अक्षर हैं ... मूल यूनिक्स शैली धीमी ASR-33 टेलेटिप पर विकसित हुई, जिसने terseness को एक गुण बना दिया; इस प्रकार एकल-अक्षर विकल्प। वास्तविक प्रयास के लिए शिफ्ट कुंजी को दबाए रखना; इस प्रकार निचले मामले की प्राथमिकता, और विकल्प सक्षम करने के लिए "-" (शायद अधिक तार्किक "+" के बजाय) का उपयोग।

GNU शैली दो हाइफ़न से पहले विकल्प कीवर्ड (कीवर्ड अक्षरों के बजाय) का उपयोग करती है। यह वर्षों बाद विकसित हुआ जब कुछ विस्तृत GNU उपयोगिताओं ने एकल-पत्र विकल्प कुंजियों से बाहर निकलना शुरू कर दिया ( यह लक्षण के लिए एक पैच का गठन किया, अंतर्निहित बीमारी का इलाज नहीं )। यह लोकप्रिय बना हुआ है क्योंकि जीएनयू विकल्प पुरानी शैलियों की वर्णमाला सूप की तुलना में पढ़ना आसान है। 1

[१] http://www.faqs.org/docs/artu/ch10s05.html


ध्यान दें कि getopt () को पहली बार 1985 में प्रकाशित किया गया था, लेकिन UNOS (सबसे पुराना UNIX क्लोन) प्रकाशित getargs () 1982 में पहले से ही (यह 1980 में लिखा गया था) और getargs () लघु विकल्प और एकल डैश लंबे विकल्प (मल्टिक्स स्टाइल) का समर्थन करता है। UNOS ने बड़े पैमाने पर एकल डैश लंबे विकल्पों का उपयोग किया और UNOS पूर्व एटी एंड टी कर्मचारियों द्वारा लिखा गया था। 1988 में, GNU डबल डैश लॉन्ग ऑप्शंस के साथ सामने आया, जबकि UNOS ने सत्यापित किया कि सिंगल डैश लॉन्ग ऑप्शंस बहुत बढ़िया हैं।
विद्वान

28

एकल अक्षर विकल्पों का उपयोग जारी रखने के लिए एक कारण है, क्योंकि वे एक साथ बांधा जा सकता है: ls -ltrएक है बहुत से टाइप करने के लिए आसान ls --sort=time --reverse --format=long। ऐसे समय होते हैं जब दोनों का उपयोग करना अच्छा होता है। इस विषय की खोज के लिए, "यूनिक्स कमांड लाइन विकल्प सम्मेलन" का प्रयास करें।


1
+1 धन्यवाद यह वास्तव में कार्यान्वयन के पीछे तर्क के साथ मदद करता है।
लैरी

चूंकि UNIX ls यह नहीं समझता ls --sort=time --reverse --format=longहै कि इस गैर-मानक पद्धति का उल्लेख करना एक अच्छा विचार नहीं है।
स्किल

6

रेमंड से बोली @jasonwryan से कुछ उपयोगी जानकारी है, लेकिन कहानी के बीच में शुरू होता है:

  • ध्यान रखें कि यूनिक्स मल्टीिक्स के कम-गुंजाइश संस्करण के रूप में शुरू हुआ था, और यह कि इसके पूरे इतिहास में, यूनिक्स में अक्सर अन्य सिस्टमों पर देखी और उपयोग की जाने वाली सुविधाओं की नकल या अनुकूलन थे।
  • '-'विकल्प चरित्र मॉलटिक्स में इस्तेमाल किया गया था। Bitsavers अपने उपयोगकर्ता आदेशों के लिए एक मैनुअल है ।
  • अन्य प्रणालियों ने विभिन्न वर्णों का उपयोग किया, कुछ और अधिक कीस्ट्रोक-कुशल होने का दावा करते हैं (जैसे कि '/'TOPS और VMS के लिए उपयोग किया जाता है) और कुछ कम (जैसे कि '('VM / SP CMS में उपयोग किया जाता है)।
  • बहुविकल्पी विकल्प बहु-चरित्र थे, उदाहरण के लिए, अंडरस्कोर द्वारा अलग किए गए कीवर्ड।
  • लंबे समय तक बहुविकल्पी विकल्पों में अक्सर एक छोटा, संक्षिप्त रूप होता था, जैसे -printबनाम -pr(पृष्ठ 3-8)।
  • यूनिक्स विकल्प एकल-वर्ण थे, और कई वर्षों के बाद, getoptपेश किया गया था। चूँकि यह मूल यूनिक्स का हिस्सा नहीं था, इसलिए उपयोगिताओं का उपयोग नहीं किया गया था getoptऔर इसे छोड़ दिया गया था। लेकिन getoptकार्यक्रमों को सुसंगत बनाने में मदद की।

दूसरी ओर, यूनिक्स विकल्प getoptएकल-वर्ण का उपयोग कर रहे थे। अन्य सिस्टम, विशेष रूप से सभी बड़े वाले, कीवर्ड का उपयोग करते थे। कुछ (सभी नहीं) ने उन खोजशब्दों को संक्षिप्त करने की अनुमति दी , अर्थात, जब तक कि विकल्प असंदिग्ध नहीं था, सभी वर्ण प्रदान नहीं किए गए थे। अस्पष्टता के लिए उस परीक्षण में नुकसान होते हैं। उदाहरण के लिए:

  • 1985 की शुरुआत में, मैं एक कार्यक्रम पर काम कर रहा था, जिसे प्रिमोस में पोर्ट किया जाना था । प्राइम के डेवलपर्स ने कई अन्य कंपनियों के साथ एक कमांड-भाषा की पेशकश करके प्रतिस्पर्धा की, जो (उन सभी में से प्रत्येक की नकल करने की कोशिश की), प्रत्येक से सबसे अधिक उपयोग की जाने वाली कमांड प्रदान करते हैं। बेशक, उन्होंने संक्षिप्त समर्थन किया (जैसा कि वीएमएस ने किया था)। ऑनलाइन मदद पढ़ने के बाद, मैंने टाइप किया sta, सोचने के लिए status। यह संक्षिप्त नाम था start, और शुरू करने के लिए कुछ भी नहीं दिया गया था , कमांड दुभाषिया ने मुझे बंद कर दिया।
  • एक्स टूलकिट ( xterm द्वारा प्रयुक्त ) संक्षिप्त विकल्पों की अनुमति देता है। एक्सटर्म में इसे प्रभावी ढंग से उपयोग करने के लिए, इसे (दृश्य घंटी) -vओवर -vb( पसंद के लिए) के लिए कमांड मापदंडों को प्राथमिकता देना होगा । अस्पष्टता होने पर पसंदीदा टूल को निर्दिष्ट करने के लिए एक्स टूलकिट का कोई सीधा तरीका नहीं है।

अस्पष्टता के लिए इस क्षमता के कारण, कुछ डेवलपर्स संक्षिप्त अनुमति नहीं देना पसंद करते हैं। उदाहरण के लिए, लिंक्स संक्षिप्तीकरण की अनुमति के बिना बहु-वर्ण विकल्पों का उपयोग करता है।

सभी कार्यक्रमों का उपयोग नहीं किया गया getopt: tarऔर psनहीं किया। और न ही rcs(या sccs), जैसा कि आप देख सकते हैं जहां डैश वैकल्पिक था, और विकल्प मान वैकल्पिक थे।

इस सब को ध्यान में रखते हुए, GNU डेवलपर्स ने getoptप्रत्येक छोटे विकल्प का एक लंबा संस्करण प्रदान करने के लिए विस्तार करके अन्य प्रणालियों में उपयोग किए जाने वाले कीवर्ड विकल्पों को अनुकूलित किया । उदाहरण के लिए, textutils 1.0 changelog कहते हैं

Tue May  8 03:41:42 1990  David J. MacKenzie  (djm at abyss)

        * tac.c: Use regular expressions as the record boundaries.
        Give better error messages.
        Reformat code and make it more readable.
        (main): Use getopt_long to parse options.

फाइलुटिल में परिवर्तन पहले था:

Tue Oct 31 02:03:32 1989  David J. MacKenzie  (djm at spiff)

        * ls.c (decode_switches): Add long options, using getopt_long
        instead of getopt.

और किसी को अभी भी एक मिल सकता है, लेकिन ऐसा लगता है कि फ़ाइल-हेडर जल्द से जल्द तारीख दिखाता है:

/* Getopt for GNU.
   Copyright (C) 1987, 1989 Free Software Foundation, Inc.

जो (उदाहरण के लिए) एक्स टूलकिट (1987) के साथ समवर्ती है। अधिकांश यूनिक्स उपयोगिताओं जिनके साथ आप परिचित हैं (जैसे कि ls, ps) ने मौजूदा एकल-वर्ण विकल्पों का उपयोग किया, जिन्हें मैनुअल में आवधिक यात्राओं की आवश्यकता होती है। शुरू करते समय getopt_long, GNU डेवलपर्स ने पहले नए विकल्प जोड़कर ऐसा नहीं किया ; वे मौजूदा विकल्पों को सारणीबद्ध करके और एक लंबे मिलान विकल्प प्रदान करके शुरू हुए।

क्योंकि वे एक मौजूदा प्रदर्शनों की सूची में जोड़ रहे थे , इसलिए (फिर से) मौजूदा विकल्पों के साथ संघर्ष की समस्या थी। इससे बचने के लिए, उन्होंने लंबे विकल्पों से पहले दो डैश का उपयोग करते हुए सिंटैक्स को बदल दिया।

ये कार्यक्रम getopt_longइस तरह से सामान्य कारणों से उपयोग करना जारी रखते हैं :

  • स्क्रिप्ट विकल्पों पर निर्भर करती हैं; डेवलपर्स स्क्रिप्ट्स को तोड़ने के लिए उत्सुक नहीं हैं
  • एक लिखित कोडिंग मानक है (जो प्रभावी हो सकता है)
  • कोई भी उपकरण के एक प्रतिस्पर्धा सेट के साथ नहीं आया है जो स्पष्ट रूप से असंगत है (दोनों बीएसडी और जीएनयू डेवलपर्स एक दूसरे से विकल्प नाम कॉपी करते हैं)

3

विकिपीडिया कमांड लाइन इंटरफ़ेस में यह बताया गया है:

यूनिक्स जैसी प्रणालियों में, ASCII हाइफ़न-माइनस आमतौर पर विकल्पों को निर्दिष्ट करने के लिए उपयोग किया जाता है। चरित्र आमतौर पर एक या एक से अधिक पत्रों के बाद होता है। एक तर्क जो बिना किसी अक्षर के अपने आप में एक एकल हाइफ़न-माइनस है, आमतौर पर निर्दिष्ट करता है कि एक प्रोग्राम को मानक इनपुट से आने वाले डेटा को संभालना चाहिए या मानक आउटपुट पर डेटा भेजना चाहिए। दो हाइफ़न-माइनस वर्ण (-) का उपयोग "लंबे विकल्प" को निर्दिष्ट करने के लिए कुछ कार्यक्रमों पर किया जाता है जहां अधिक वर्णनात्मक विकल्प नामों का उपयोग किया जाता है। यह जीएनयू सॉफ्टवेयर की एक सामान्य विशेषता है।


यह इस सवाल का जवाब नहीं देता है कि यह सम्मेलन कहां से आया है और इसका उपयोग क्यों जारी है।
छरवे

1

मेरा अनुमान है कि अधिक वर्णनात्मक विकल्प वांछित थे और लंबे विकल्पों के साथ आप एकल चरित्र विकल्पों में से बाहर चलने के बारे में चिंता करने वाले नहीं हैं।

एक बार जब आप तय कर लेते हैं कि आप लंबे विकल्प चाहते हैं तो आपके पास एक मुद्दा है, कम से कम यदि आप लंबे और छोटे दोनों विकल्पों का समर्थन करने की योजना बनाते हैं। मैं सकारात्मक नहीं हूँ, लेकिन मेरा मानना ​​है कि arcege का उत्तर इस बात की कुंजी है कि क्यों - और -। एक सामान्य प्रसंस्करण दिनचर्या, उदा। getopt_long (), को यह जानना होगा कि क्या एक एकल कमांड लाइन तर्क में कई विकल्प हो सकते हैं, जैसे। -एल टीआर। इस प्रकार एक प्रसंस्करण दिनचर्या को दोनों के बीच अंतर करने में सक्षम होना चाहिए। यदि मैं एक ही डैश पढ़ता हूं, -, तो कमांड लाइन के बाकी तर्क कई विकल्पों से मेल खा सकते हैं। यदि मैं एक डबल डैश पढ़ता हूं, -, तो कमांड लाइन के बाकी तर्क एकल विकल्प से मेल खाते हैं।

मैंने अभी हाल ही में getopt_long () का उपयोग किया है और मैं लंबे विकल्पों को पसंद करना शुरू कर रहा हूं क्योंकि उन्हें याद रखना आसान है और स्व-दस्तावेजीकरण। यदि मेरे पास निम्नलिखित दो आदेश हैं:

./aggregator -f 15

./aggregator --flush समय 15

मैं कहूंगा कि लंबे विकल्प का उपयोग करने वाला दूसरा आत्म व्याख्यात्मक है।


0

शायद कुछ कारण हैं कि दो विधियों का उपयोग किया जाता है। एक, निश्चित रूप से, परंपरा है। प्रोग्रामर और उपयोगकर्ता मनुष्य हैं, और मनुष्य एक निश्चित तरीके से काम करने की उम्मीद करते हैं। यदि बदलने का कोई कारण नहीं है (और वास्तव में, कमांड लाइन के लिए, बदलने का बहुत कारण नहीं है), तो नहीं।

यह कहा जा रहा है, मुझे पता है कि वहाँ उपकरण हैं जो एक लंबे विकल्प के लिए एकल हाइफ़न का उपयोग करते हैं, या यहां तक ​​कि पूरी तरह से हाइफ़न से छुटकारा पाते हैं। ये उपकरण पहली बार में मुश्किल हो सकते हैं, और एक अन्यथा एकीकृत प्रणाली में मौसा के रूप में बाहर रहना पसंद करते हैं।

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

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