Unix / Linux'ta seçenek sınırlandırmasının sonu olarak çift çizgi (-) ne zaman ve nasıl tanıtıldı?


49

Tarihsel Unix'teki kabuğun / yardımcı programların ya da seçenekler sınırlandırıcısının sonu olarak bir çift tire (veya ardışık iki tire) kullanarak desteklenen 4.4BSD kadar "yeni" bir şey olduğunu sanmıyorum . İle FreeBSD , sen mesela tanıtılan bir not görebilirsiniz man sayfalarını ile 2.2.1 sürümü (1997). Ama bu sadece bir komutun dokümantasyonu.rm

Bulabildiğim en eski GNU fileutils changelog'una baktığımda , şunu görüyorum 1 (biraz değişmiş):

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.

Bu Linux'tan önce gelir . Varolan bir dosya için bir zaman damgası belirtmek yerine, zaman belirtimi ile aynı sayıdaki basamakları (sekiz ya da on basamaklı ondalık sayı) içeren bir ada sahip olmak isteyebileceğiniz gerçeğini açık bir şekilde açıklıyor ...


  • Öyleyse, Unix mermilerindeki seçenekler sınırlayıcısının sonu olarak double- dash'i ( --) tanıtan posix.1 mi?
  • Tüm bunlar touch90'lı yılların başlarında dosya adlarında rakam kullanmak istediği için başladı mı ve sonra bu bir parça parça bir şekilde bir on yıl boyunca her seferinde bir yardımcı programda devam etti?
  • Değişim alanındaki ruhlu yorum neyle ilgili?
  • POSIX Yardımcı Program Sözdizimine ne zaman Kılavuz 10 ( argüman - seçeneklerin sonunu gösteren sınırlayıcı olarak kabul edilmelidir. [...] ) ?

1. aksine bu belgeleyen yani uzun seçenekleri ilgisiz tüm dünyadaki komutlar kullanımında. Öte yandan, sınırlayıcıya yapılan referansı , 2005 yılında son kullanıcıya maruz kalmadan önce, 2000 yılında GNU rm.c gibi bir durumda göründüğünü görebilirsiniz ( diagnose_leading_hyphen işlevi). Ancak bu çok daha sonra ve çok özel bir kullanım durumuyla ilgili.


1
BSD4.3RENO en azından getoptdesteklenen bir şeye sahipti --.
Stéphane Chazelas

@ StéphaneChazelas Ayrıca sınırlayıcı ile ilgilenebilecek tek api olmama konusunda getopt hakkında bir yorum yaptın . Bu, gerçekten kullanılmadan önce bunun için sağlandığı ve çalıştığı anlamına mı geliyor? Korkarım bu benim ötesimde. Teşekkür ederim!

2
Muhtemelen geçici olarak birkaç rastgele program tarafından kullanılıyordu, ancak getoptilk 1980'lerin başında yazıldığında belgelendiğini düşünüyorum . Birisi getopt belgesini Uniforum '85'den alabilirse, bu biraz tarih verebilir.
Mark Plotnick

2
@MarkPlotnick, aslında SysIII'de (1980) bulunan getopt destekliyor --.
Stéphane Chazelas

Yanıtlar:


38

Söyleyebileceğim kadarıyla, --seçenekler sonu işaretçisi olarak kullanılması , System III Unix (1980) ile başlar shve başlar getopt.

Bourne Kabuğu ailesinin bu tarihine göre , Bourne Kabuğu ilk olarak Versiyon 7'de Unix'te (1979) ortaya çıktı . Ama bir yol yoktu setiçin Tartışmalarınızın seçenekleri ayırmak . Böylece orijinal Bourne kabuğu şunları yapabilir:

  • set -e - hata çıkış modunu aç
  • set arg1 arg2 ...- konum parametreleri ayarlar $1=arg1, $2=arg2vb

Ama: set arg1 -e arg2seni verecekti $1=arg1, $2=arg2ve çıkışta-on-yanılma açmak . Whoops.

System III Unix (1980) bu hatayı düzeltti ve tanıttı getopt. Göre getoptbireyin adam sayfası :

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.

Söyleyebileceğim kadarıyla, göründüğü ilk yer orası.

Oradan, diğer komutların 1980'lerin vahşi, standartsız günleri boyunca --argüman ayrıştırma belirsizliklerini ( yukarıdaki örneklerle touchve rmsizin de bahsettiğiniz gibi) çözme anlaşmasını kabul ettiği anlaşılıyor .

Bu parça parça evlat edinmelerin bazıları, POSIX.1 (1988) ' de kodlanmıştır , ki buradaki "POSIX-gerekli çamur" hakkındaki değişiklik listesi yorumdan kaynaklanmaktadır.

Ancak POSIX.2 (1992) 'ye kadar , ünlü Kılavuz İlke 10'u içeren Yardımcı Sözdizimi Kılavuzları kabul edilmedi.

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.

Ve işte bu “kludge” olmaktan evrensel bir öneriye doğru gittiği yer.


Zaman ayırdığınız için teşekkürler! Bu tür bir soyutlanmış fayda / fonksiyonun neden gerekli olduğunu kavramadığım için araştırmalarımda getopt'u çoğunlukla görmezden gelmiştim. Şimdi bunun, sysv'nin yapamadığı gibi boşluklarla vb. İlgilenmek için bir noktada yeniden planlandı (getopts)getopt . Daha fazlasını okuyacağım! Tekrar teşekkürler!

5
Komut satırı seçeneklerini ayrıştırmak için neden standart bir yardımcı programın yararlı olacağını anlamıyorsanız, komut satırı seçenekleri için bir kabuk ayrıştırıcı yazmayı denemediniz mi? Bir tür acı! Bunu benim için başka bir araç da yapsaydı elbette iyi olurdu ... Ayrıca şunu aklınızdan çıkarmayın: 1980'de Python, Ruby, Java, Perl, PHP, hatta C ++ henüz icat edilmemişti. Tüm "kabuk komut dosyası oluşturma" fikri hala oldukça yeniydi. Bu yüzden standart bir komut satırı çözümleyici fikri hala oldukça romandı!
Ağustos'ta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.