कमांड लाइन विकल्प शैली - POSIX या क्या?


16

कहीं मैंने देखा कि जावा / जेवैक के खिलाफ कथित रूप से विंडोज और यूनिक्स शैली के मिश्रण का उपयोग करते हुए एक रेंट देखा गया

java -classpath ... -ea ... Something

IMHO, यह कोई मिश्रण नहीं है, यह सिर्फ findकाम के रूप में अच्छी तरह से है, है ना? AFAIK, POSIX के अनुसार, वाक्यविन्यास जैसा होना चाहिए

java --classpath ... --ea ... Something

और -abcdefएक ही बार में 6 छोटे विकल्पों को निर्दिष्ट करने का मतलब होगा। मुझे आश्चर्य है कि कौन सा संस्करण सामान्य रूप से कम टाइपिंग और कम त्रुटियों की ओर जाता है।

मैं जावा में एक छोटी सी उपयोगिता लिख ​​रहा हूं और किसी भी स्थिति में मैं विंडोज शैली का उपयोग करने जा /a /bरहा हूं क्योंकि मैं मुख्य रूप से यूनिक्स में दिलचस्पी रखता हूं। मुझे किस शैली का चयन करना चाहिए?


1
POSIX 1003.1-2003, बेस परिभाषाएँ, अध्याय 12, धारा 2 उपयोगिता कमांड-लाइन सिंटैक्स के बारे में निम्नलिखित दिशा-निर्देश देता है: "प्रत्येक विकल्प का नाम पोर्टेबल वर्ण सेट से एकल अल्फ़ान्यूमेरिक वर्ण (अलनम वर्ण वर्गीकरण) होना चाहिए।" और "सभी विकल्पों को '-' सीमांकक चरित्र से पहले होना चाहिए।"
ग्रेग ए। वुड्स

जवाबों:


21

आप पोसिक्स तर्क सम्मेलनों को यूटिलिटी कन्वेंशन चैप्टर में पा सकते हैं । POSIX शैली में एक एकल डैश के साथ विकल्पों का समावेश होता है, जिसके बाद एक एकल अक्षर द्वारा विकल्प का संकेत दिया जाता है, एक स्थान द्वारा विकल्प से अलग तर्क मान के साथ।

नियमों के अपवाद हैं - findउदाहरण के लिए - लेकिन ये ऐतिहासिक यूनिक्स उदाहरणों के कारण हैं।

एक्स विंडोज (एक्स 11) findएक जैसे डैश, लंबे नाम के विकल्पों का उपयोग करता है ।

डबल-डैश लॉन्ग नेम ऑप्शंस जीएनयू ( +एक उपसर्ग के रूप में उपयोग करने के चक्कर के बाद) द्वारा अग्रणी थे ।

ज्ञात कमांड लाइन तर्क प्रणाली की विस्तृत विविधता की चर्चा के लिए यह StackOverflow प्रश्न देखें - बहुत सारे हैं। ( चूंकि यह लिखा गया था, शक्तियों-कि-जा सवाल का निर्णय लिया अतः 367,309 नहीं एसओ के लिए बिल्कुल उपयुक्त था। मैं एक और सवाल का जवाब हस्तांतरित की है, क्या एक यूनिक्स शेल कमांड के जनरल वाक्य रचना क्या है? )

gitजहाँ आप एक संरचना प्राप्त करते हैं, वहां (और कई अन्य प्रणालियों के लिए) तकनीकों की सूची को बढ़ा सकते हैं:

  • basecommand[ वैश्विक विकल्प ] subcommand[ उप-कमांड विकल्प ] [नाम ...]

कई उप-आदेश हो सकते हैं, जिनमें से प्रत्येक के पास अपने स्वयं के विकल्प हैं।

बेशक, /डैश के बजाय विकल्पों को इंगित करने के लिए विंडोज (प्रयुक्त) स्लैश ' ' का उपयोग करता है -

JCL (z / OS के लिए, और OS / 360, और मध्यवर्ती सिस्टम) अल्पविराम द्वारा अलग किए गए स्थितीय मापदंडों का उपयोग करने के लिए जाता है, और आमतौर पर इसे उपयोगकर्ता के अनुकूल या एक अच्छा इंटरफ़ेस नहीं माना जाता है।


1
+1 अच्छे लिंक और उल्लेख के लिए git
मातरिनस

मुझे सभी उत्तर पसंद हैं, लिंक के कारण इसे स्वीकार कर लिया।
माॅर्टिनस

स्टैकओवरफ़्लो प्रश्न हटा दिया गया है (या संभवतः स्थानांतरित किया गया है) ... किसी को भी पता है कि यह कहां गया? मैं इसे पढ़ने के लिए उत्सुक हूं।
मिज़िपज़ोर

1
@ मिज़िपज़ोर: सूचना के वर्तमान स्थान के लिए अद्यतन देखें। विकल्प तर्क के साथ लघु / लंबे विकल्प
जोनाथन लेफ़लर

"बेशक, डैश के बजाय विकल्पों को इंगित करने के लिए विंडोज उपयोग (प्रयुक्त) स्लैश / 'का उपयोग करता है।" - " अधिकांश विंडोज कमांड लाइन टूल अब दोनों का समर्थन करते हैं, और पावरशेल केवल डैश का उपयोग करने का तरीका है।
jpmc26

15

संपादित करें: यह बताया गया है कि यह शैली एक GNU-ism है, और यह कि गैर-GNU आधारित यूनिक्स एकल-डैश सिंटैक्स (विशेष रूप से, OS X और BSD वेरिएंट) का उपयोग करते हैं।

जीएनयू-इसम स्थिति के बावजूद, कई नए लिखित यूनिक्स-शैली कार्यक्रम इस शैली का उपयोग करते हैं:

  • --long-option लंबे विकल्प नामों के लिए,
  • -s छोटे (एक-चरित्र) विकल्पों के लिए,
  • -abc बिना तर्क के कई छोटे विकल्पों के लिए (एक विकल्प प्रति वर्ण)।
  • तर्क के साथ विकल्प:
    • --long argया --long=argलंबे विकल्पों के लिए,
    • -s arg, -sargया (वैकल्पिक रूप से) -s=argछोटे विकल्पों के लिए। इसे अन्य छोटे विकल्पों के साथ जोड़ा जा सकता है, जब तक कि अंतिम में केवल एक तर्क हो।
  • एक ही "शब्दार्थ" विकल्प में कई उपनाम हो सकते हैं, सबसे सामान्य रूप से एक (टाइप करने के लिए तेज) और एक लंबा (याद रखने में आसान)।

किसी ने भी किसी भी समय के लिए लिनक्स शैल का उपयोग किया है , इस शैली 1 से परिचित होना चाहिए , इसलिए इसके पक्ष में कम से कम आश्चर्य का सिद्धांत है। लंबे विकल्पों के साथ अस्पष्ट होने के बिना कई छोटे विकल्पों का समूहन भी अच्छा है।

1 उदाहरण के लिए, (मेरी Linux मशीन पर) इस शैली का प्रयोग कार्यक्रमों में से कुछ: ls, grep, man, sed, bash, आदि ( संपादित करें: इन जाहिरा तौर पर जीएनयू-वाद हालांकि, बीएसडी और ओएस एक्स मशीनों इस शैली का उपयोग नहीं करते हैं)

वहाँ कई पुस्तकालयों कि आप के लिए यह पार्स करने की देखभाल कर सकते हैं (सबसे प्रसिद्ध जा रहा है जीएनयू के कार्यान्वयन की getopt ), केवल क्या लंबी और छोटी विकल्प मौजूद हैं, चाहे वे एक तर्क लेते हैं, और क्या है जब एक करने के लिए निर्दिष्ट करने के लिए आप की आवश्यकता होगी, विकल्प मिल गया है। (और निश्चित रूप से, स्थितिगत तर्कों के लिए क्या करना है, अर्थात जो शुरू -नहीं होते हैं और पिछले विकल्पों के लिए तर्क नहीं हैं)

findएक बहुत पुराना कार्यक्रम है (या शायद अधिक संभावना है: एक बहुत पुराने कार्यक्रम का पुनर्लेखन संस्करण) जिसे एक नई कमांड लाइन सिंटैक्स का उपयोग करने के लिए आसानी से नहीं बदला जा सकता है। बहुत सी स्क्रिप्ट्स टूट जाएंगी, और पुराने सिंटैक्स के लिए उपयोग किए जाने वाले कई उपयोगकर्ता शिकायत करेंगे। javacसंभावित रूप से gccऔर दोस्तों से प्रभावित था , जो ऐतिहासिक कारणों से एक पुराने वाक्यविन्यास का पालन करते हैं।


+1 - साथ ही, आप विकल्पों में से सैकड़ों जब, आप बस है रचनात्मक पाने के लिए (उदाहरण के लिए जब एक संकलक लेखन)
टिम पोस्ट

1
आप यह धारणा देते हैं कि सभी यूएनआई जीएनयू बर्तनों का उपयोग करते हैं (अर्थात डैश-डैश आर्ग) और यह गलत है। मैक ओएस एक्स का उनके लिए कोई समर्थन नहीं है, और फ्री बीएसडी के लिए भी यही लागू होता है।
मार्टिन विकमैन

8
  • डैश-डैश ( --long-arg) के साथ तर्क एक GNU कन्वेंशन है (देखें उनका गेटअप कार्यान्वयन)।
  • POSIX कमांड कभी भी दोहरे डैश तर्क का उपयोग नहीं करता है। यह लिनक्स को छोड़कर यूनिक्स (मैक ओएस एक्स, बीएसडी) के अधिकांश वेरिएंट पर लागू होता है जो डिफ़ॉल्ट रूप से जीएनयू का उपयोग करता है।

अपने Java प्रोजेक्ट के लिए, आप Java या Apache CLI के लिए GNU गेटअप को देखना चाहते हैं । वे दोनों सम्मेलनों का समर्थन करते हैं।

एक तीसरा विकल्प जावा वीएम तर्कों का उपयोग करना है और उन्हें आपके लिए रनटाइम पार्स करना है:

 $ java -Dcolor=blue

और फिर, कोड में:

 System.getProperty("color");

व्यक्तिगत रूप से, मैं -Dमुहावरे का उपयोग करूंगा और जावा शेल्टेशन को शेल-स्क्रिप्ट में लपेटूंगा, जो कमांड लाइन पार्सिंग को शामिल करता है जिसमें क्लासपैथ आदि की जाँच करना शामिल है। इससे देशी उपयोगकर्ताओं के लिए आपका जावा प्रोग्राम चलाना भी आसान हो जाता है।


1

निर्भर करता है। मैं व्यक्तिगत रूप से POSIX शैली पसंद करता हूं, लेकिन आपके मामले में मैं संभवतः उस वातावरण के साथ निरंतरता का लक्ष्य रखूंगा जिसमें आपका उपकरण उपयोग होने जा रहा है। इसका मतलब है कि JARs के लिए जावा कन्वेंशन का उपयोग करना (जब तक कि आपके पास एक रैपर स्क्रिप्ट होने की योजना नहीं है जो इसे एक विशिष्ट यूनिफ़ॉर्म कमांड की तरह दिखाई देगा)।

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