Unix / Linux में विकल्प सीमांकक के अंत के रूप में डबल-डैश (-) कब और कैसे पेश किया गया था?


49

मुझे नहीं लगता है कि ऐतिहासिक यूनिक्स में शेल / उपयोगिताओं और न ही "हाल ही में" के रूप में 4.4BSD के रूप में कुछ के रूप में एक डबल-डैश (या लगातार दो हाइफ़न) विकल्प सीमांकक के अंत के रूप में समर्थित हैFreeBSD के साथ , आप उदाहरण के लिए 2.2.1 रिलीज (1997) के साथ rm मैनपे में पेश किए गए एक नोट देख सकते हैं । लेकिन यह सिर्फ एक आदेश के लिए प्रलेखन है।

सबसे पुराने को देखते हुए जीएनयू fileutils बदलाव का मैं पा सकते हैं, मैं यह देखने 1 (थोड़ा बदल):

Tue Aug 28 18:05:24 1990  David J. MacKenzie  (djm at albert.ai.mit.edu)

* touch.c (main): Don't interpret first non-option arg as a   <---
  time if `--' is given (POSIX-required kludge).  
* touch.c: Add long-named options.
* Many files: Include <getopt.h> instead of "getopt.h" since
  getopt.h will be in the GNU /usr/include.
* install.c: Declare some functions.
* touch.c, getdate.y, posixtime.y, mktime.c: New files, from bin-src.
* posixtime.y: Move year from before time to after it (but
  before the seconds), for 1003.2 draft 10.

यह लिनक्स को भविष्यवाणी करता है । यह स्पष्ट रूप से इस तथ्य के लिए जिम्मेदार है कि आप एक फ़ाइल बना सकते हैं, जिसमें एक समय विनिर्देश (आठ या दस-अंकों की दशमलव संख्या) के समान अंकों वाला एक नाम है - बजाय एक मौजूदा फ़ाइल के टाइमस्टैम्प को निर्दिष्ट करने के लिए ...


  • तो क्या यह posix.1 है जिसने Unix गोले में विकल्प सीमांकक के अंत के-- रूप में डबल-डैश ( ) पेश किया है ?
  • क्या यह सब शुरू हुआ क्योंकि कुछ लोग touch90 के दशक की शुरुआत में फिल्नाम में अंकों का उपयोग करना चाहते थे और फिर एक दशक के लिए एक समय में एक टुकड़ा फैशन उपयोगिता में चला गया ??
  • चैंज में सर्पोट की गई टिप्पणी क्या है?
  • किया गया था दिशानिर्देश 10 ( तर्क -। परिसीमक के विकल्प के अंत का संकेत के रूप में स्वीकार किया जाना चाहिए [...] ) POSIX के लिए शुरू की उपयोगिता सिंटेक्स ?

1. के रूप में करने का विरोध किया इस यानी दस्तावेजीकरण लंबे विकल्पों सभी आदेशों के उपयोग में विश्व स्तर पर है, जो संबंधित नहीं है। दूसरी ओर, आप सीमांकक के संदर्भ में देख सकते हैं दिखाई देते हैं की तरह कुछ में जीएनयू rm.c , एक टिप्पणी के रूप में 2000 में किए जाने से पहले संपर्क में 2005 में अंत उपयोगकर्ता के लिए ( diagnose_leading_hyphen समारोह)। लेकिन यह सब बहुत बाद में है और एक बहुत ही विशिष्ट उपयोग के मामले में है।


1
BSD4.3RENO कम से कम एक getoptसमर्थित था --
स्टीफन चेजलस

@ StéphaneChazelas आपने परिसीमन से निपटने में सक्षम एकमात्र एप्टीट्यूड नहीं होने के बारे में एक टिप्पणी की । इसका मतलब यह है कि यह प्रदान किया गया था और काम करने से पहले यह वास्तव में इस्तेमाल किया जा रहा था ?? मुझे डर है कि यह मेरे से परे है। धन्यवाद!

2
यह शायद कई यादृच्छिक कार्यक्रमों द्वारा एक तदर्थ आधार पर इस्तेमाल किया गया था, लेकिन मुझे लगता है कि यह पहली बार प्रलेखित हो getoptगया जब 1980 के दशक की शुरुआत में लिखा गया था। अगर किसी को यूनीफोरम '85 से गेटॉप पेपर मिल सकता है, तो वह कुछ इतिहास दे सकता है।
मार्क प्लॉटनिक

2
@MarkPlotnick, वास्तव में SysIII (1980) के समर्थन के रूप में मिल जाता है --
स्टीफन चेजलस

जवाबों:


38

जहाँ तक मेरा बता सकते हैं, के उपयोग --के रूप में अंत के विकल्प-मार्कर के साथ शुरू होता है shऔर getoptप्रणाली III यूनिक्स (1980) में।

बॉर्न शेल परिवार के इस इतिहास के अनुसार , बॉर्न शेल पहली बार संस्करण 7 यूनिक्स (1979) में दिखाई दिया । लेकिन इसके लिए एक रास्ता नहीं था setकरने के लिए तर्क से अलग विकल्प । तो मूल बॉर्न खोल सकता है:

  • set -e - बाहर निकलने पर त्रुटि मोड चालू करें
  • set arg1 arg2 ...- सेट स्थितीय मापदंडों $1=arg1, $2=arg2आदि

लेकिन: set arg1 -e arg2आपको देता है $1=arg1, $2=arg2और बाहर निकलने पर त्रुटि चालू करता है । ओह।

सिस्टम III यूनिक्स (1980) ने उस बग को ठीक किया और पेश किया getoptgetopt'के आदमी पृष्ठ के अनुसार :

NAME
   getopt - parse command options

SYNOPSIS
   set -- `getopt optstring $∗`

DESCRIPTION
   Getopt is used to break up options in command lines for easy parsing by
   shell procedures, and to check  for  legal  options.   Optstring  is  a
   string  of  recognized  option letters (see getopt(3C)); if a letter is
   followed by a colon, the option is expected to have an  argument  which
   may or may not be separated from it by white space.  The special option
   -- is used to delimit the end of the options.  Getopt will place --  in
   the  arguments  at  the  end  of  the  options, or recognize it if used
   explicitly.  The shell arguments ($1 $2 . . .) are reset so  that  each
   option  is  preceded  by a - and in its own shell argument; each option
   argument is also in its own shell argument.

जहाँ तक मैं बता सकता हूँ, यह पहली जगह है।

वहाँ से, ऐसा लगता है कि अन्य आदेशों ने 1980 के दशक के जंगली, मानक दिनों के दौरान --तर्क अस्पष्टताओं (जैसे उदाहरणों के साथ touchऔर rmआप ऊपर का हवाला देते हैं) को हल करने के लिए अधिवेशन को अपनाया ।

इन टुकड़ों में से कुछ गोद लेने को POSIX.1 (1988) में संहिताबद्ध किया गया था, जो कि "POSIX- आवश्यक कीचड़" के बारे में चैंज टिप्पणी करता है।

लेकिन यह POSIX.2 (1992) तक नहीं था कि उपयोगिता सिंटैक्स दिशानिर्देशों को अपनाया गया था, जिसमें प्रसिद्ध दिशानिर्देश 10 शामिल हैं:

Guideline 10:    The argument "--" should be accepted as a delimiter
                 indicating the end of options.  Any following
                 arguments should be treated as operands, even if they
                 begin with the '-' character.  The "--" argument
                 should not be used as an option or as an operand.

और यही वह जगह है जहाँ से यह एक सार्वभौमिक सिफारिश के लिए "कीचड़" बन जाता है।


समय निकालने के लिए आपका धन्यवाद! मैंने अपने "शोध" में ज्यादातर उपेक्षा को अपनाया था क्योंकि मैं समझ नहीं पाता कि इस तरह की अमूर्त उपयोगिता / कार्य की आवश्यकता क्यों है। अब मैंने पढ़ा कि यह कुछ समय पर रीगाइनर्ड (गेटोप्स) था , जो कि रिक्त स्थान से निपटने के लिए sysv के रूप में getoptनहीं था। मैं इसके बारे में अधिक पढ़ूंगा! एक बार फिर धन्यवाद!

5
यदि आप समझ नहीं पाते हैं कि कमांड-लाइन विकल्पों को पार्स करने के लिए एक मानक उपयोगिता क्यों उपयोगी होगी, तो शायद आपने कमांड-लाइन विकल्पों के लिए शेल पार्सर लिखने की कोशिश नहीं की है? यह एक तरह का दर्द है! यकीन है कि अच्छा होगा यदि किसी अन्य उपकरण ने मेरे लिए यह किया ... इसके अलावा, ध्यान रखें: 1980 में कोई पायथन नहीं था, कोई रूबी, कोई जावा, कोई पर्ल, कोई पीएचपी - यहां तक ​​कि सी ++ का अभी तक आविष्कार नहीं हुआ था, और "शेल स्क्रिप्टिंग" का पूरा विचार अभी भी बहुत नया था। तो एक मानक कमांड-लाइन पार्सर का विचार अभी भी बहुत उपन्यास था!
वूड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.