Tek karakter seçenekleri için tek çizgi `-`, ancak kelimeler için çift çizgi` --`?


51

Harfler için tek satırlar kullanma ve sözcükler için satırlar iki katına çıkma sözleşmesi nereden geldi ve neden kullanılmaya devam edildi?

Örneğin, eğer yazarsam şunu ls --helpgörüyorsunuz:

  -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 ~
...

Googling'i - and -- conventionküçük başarılarla alıntılarla bile denedim .


6
Sadece nit-seçici burada olmak, ancak karakter -teknik olarak kısa çizgi olarak adlandırılır . Çoğu durumda em kısa çizgi (-) ve bazen en kısa çizgi (-) ifadelerini kullanmak için "tire" kelimesini kullanıyoruz, ancak hiçbiri tire (-) değildir.
chharvey

4
: İyi bilinen programlar olsa da, kongre takip etmediğinde Gerçekten beni rahatsız ediyorjava -version
Kimberly W

4
@Jilil Evet. Neden burada olduğunu merak ederek sona find . -delete
erdim

Gibi şeyleri yazmak, böylece bu fikir -abhem aktive eder ave b. Çift çizgi olmadan, -helpaktive olur h, e, l, ve pseçenekleri.
Aaron Franke

Yanıtlar:


61

In Unix Programlama Sanatı bu uygulama gelişti nasıl Eric Steven Raymond açıklar:

Orijinal Unix geleneğinde, komut satırı seçenekleri tek bir kısa çizgi önce gelen tek harflerdir ... Orijinal Unix tarzı, zıtlığı bir erdem haline getiren yavaş ASR-33 teletiplerinde gelişti; Böylece tek harfli seçenekler. Shift tuşunu basılı tutmak gerçek çaba gerektiriyordu; bu nedenle küçük harf tercihi ve seçenekleri etkinleştirmek için “-” (belki de daha mantıklı bir “+” yerine) kullanılması tercih edilir.

GNU stili, iki tire önce gelen seçenek anahtar kelimeleri (anahtar sözcük harfleri yerine) kullanır. Yıllar sonra, oldukça karmaşık olan GNU kuruluşlarından bazılarının tek harfli seçenek anahtarlarının tükenmeye başladığı zaman ( bu, altta yatan hastalığın tedavisi için değil, semptom için bir yama oluşturdu) yıllar sonra gelişti . Popülerdir çünkü GNU seçeneklerinin okunması eski stillerdeki alfabe çorbasından daha kolaydır. 1

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


Getopt () 'in ilk olarak 1985’de yayınlandığını, ancak UNOS’un (en eski UNIX klonu) 1982’de zaten getargs’i () yayınladığını (1980’de yazılmıştır) ve getargs’ın (kısa çizgi ve tek çizgi uzun seçenekleri) (Multics stili) desteklediğini unutmayın. UNOS, tek uzun çizgi seçeneklerini toplu bir şekilde kullandı ve UNOS, eski AT&T çalışanları tarafından yazıldı. 1988'de, UNOS tek kısa çizgi seçeneklerinin harika çalıştığını doğrulamasına rağmen, çift kısa çizgi seçenekleriyle ortaya çıktı.
schily

28

Tek harf seçeneklerini kullanmaya devam nedenlerinden biri, birlikte sinirli olabilir çünkü: ls -ltrBir olan çok daha yazmak daha kolay ls --sort=time --reverse --format=long. Her ikisinin de kullanımı iyi olduğunda birkaç kez vardır. Bu konuyu aramak için, "unix komut satırı seçenekleri kuralını" deneyin.


1
+1 Teşekkürler bu gerçekten uygulamanın arkasındaki mantığa yardımcı oluyor.
Larry

UNIX'in bu anlamadığı ls --sort=time --reverse --format=longiçin, bu standart dışı yöntemden bahsetmek de iyi bir fikir değildir.
schily

6

Raymond alıntı @jasonwryan bazı yararlı bilgiler var ama hikayenin ortasında başlar:

  • Unix'in Multics'in sınırlı kapsamlı bir sürümü olarak başladığını ve tarihi boyunca Unix'teki özelliklerin çoğu zaman diğer sistemlerde görülen ve kullanılan özelliklerin taklitleri veya uyarlamaları olduğunu unutmayın.
  • '-'Seçenek karakteri Multics kullanılmıştır. Bitsavers'ın kullanıcı komutları için bir kılavuzu vardır .
  • Diğer sistemler, bazıları daha tuşa basmada etkili olduğu ( '/'TOPS ve VMS için olduğu gibi ) ve bazılarının da ( '('VM / SP CMS'de kullanıldığı gibi) daha fazla olduğu iddia edilen farklı karakterler kullandı.
  • Multics seçenekleri çok karakterliydi, örneğin alt çizgi ile ayrılmış anahtar kelimeler.
  • Daha Uzun Multics seçenekleri genellikle -printvs gibi daha kısa ve kısaltılmış bir biçime sahiptir -pr(sayfa 3-8).
  • Unix seçenekleri tek karakterliydi ve birkaç yıl sonra getopttanıtıldı. Orijinal Unix'in bir parçası olmadığı için kullanmayan getoptve olduğu gibi bırakılan yardımcı programlar var . Ancak getoptprogramların tutarlı olmasına yardımcı olmak.

Diğer taraftan, Unix seçeneklerini kullanma getopttek karakterdi. Diğer sistemler, özellikle daha büyük olanları anahtar kelimeler kullandı. Bazıları (tümü değil) bu anahtar kelimelerin kısaltılmasına izin verdi , yani seçenek belirsiz olduğu sürece sağlanan karakterlerin tümü değil. Bu testte belirsizlik için tuzaklar var. Örneğin:

  • 1985'in başlarında, PrimOS'a taşınması gereken bir program üzerinde çalışıyordum . Prime'ın geliştiricileri, diğerlerinden her biri için en sık kullanılan komutları sağlayarak (birbirlerini taklit etmeye çalışan) bir komut dili sunarak, başka şirketlerle rekabet etti. Elbette kısaltmaları desteklediler (VMS'de olduğu gibi). Çevrimiçi yardımı okuduktan sonra yazmayı stadüşünüyorum status. Bunun kısaltmasıydı startve başlaması için hiçbir şey vermediyse , komut yorumlayıcısı beni kapattı.
  • X Toolkit ( xterm tarafından kullanılır ) kısaltılmış seçeneklere izin verir. Bunu xterm'de etkin bir şekilde kullanmak için, komut parametrelerini önceden -v(sürüm için) -vb(görsel zil) tercih etmek için önceden işlemek zorundadır . X Toolkit'in belirsizlik olduğunda tercih edilen bir seçenek belirtmenin doğrudan bir yolu yoktur.

Bu belirsizlik potansiyeli nedeniyle, bazı geliştiriciler kısaltmalara izin vermemeyi tercih ediyor. Örneğin Lynx , kısaltmalara izin vermeden çok karakterli seçenekler kullanır.

Tüm programlar kullanılmamıştır getopt: tarve kullanılmamıştır ps. Ayrıca, rcs(veya sccs), dash'in isteğe bağlı olduğunu ve seçenek değerlerinin isteğe bağlı olduğunu belirterek görebileceğiniz gibi.

Bütün bunları göz önünde bulundurarak GNU geliştiricileri, diğer sistemlerde kullanılan anahtar kelime seçeneklerini getopt, her kısa seçeneğin uzun bir versiyonunu sağlayarak genişletti . Örneğin, textutils 1.0 changelog diyor ki

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.

Fileutils'teki değişiklik daha önceydi:

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.

Birisi daha erken bir tane bulabilir, ancak dosya başlığının en erken tarihi gösterdiği anlaşılıyor:

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

(örneğin) X Toolkit (1987) ile aynı anda. Tanıdığınız Unix uygulamalarının çoğu (örneğin ls, ps), el kitabına periyodik ziyaretler gerektiren mevcut tek karakterli seçenekleri kullandı. Tanıtırken getopt_long, GNU geliştiricileri bunu önce yeni seçenekler ekleyerek yapmadılar ; Onlar başladı varolan seçenekleri tabulating ve eşleşen uzun seçeneği sunarak.

Onlar Çünkü ekleyerek varolan repertuarına, (tekrar) mevcut seçenekleri ile çatışma sorun oluştu. Bunu önlemek için, uzun seçeneklerden önce iki kısa çizgi kullanarak sözdizimini değiştirdiler.

Bu programlar getopt_longolağan nedenlerle bu şekilde kullanılmaya devam eder :

  • senaryolar seçeneklere bağlıdır; geliştiriciler senaryoları kırma konusunda endişeli değil
  • (etkili olabilir) yazılı bir kodlama standardı vardır
  • hiç kimse belirgin bir şekilde uyumsuz olan rakip bir araç seti bulamamıştır (hem BSD'ler hem de GNU geliştiricileri seçenek adlarını birbirinden kopyalar)

3

Wikipedia Komut satırı arayüzünde bildirilir:

Unix benzeri sistemlerde, ASCII kısa çizgi – eksi genellikle seçenekleri belirlemek için kullanılır. Karakteri genellikle bir veya daha fazla harf izler. Harfsiz tek başına kısa çizgi eksi olan bir argüman genellikle bir programın standart girdiden gelen verileri işlemesi veya standart çıktıya veri göndermesi gerektiğini belirtir. Daha açıklayıcı seçenek adlarının kullanıldığı "uzun seçenekler" i belirtmek için bazı programlarda iki kısa çizgi eksi karakteri (-) kullanılır. Bu GNU yazılımının ortak bir özelliğidir.


Bu, sözleşmenin nereden geldiği ve neden kullanılmaya devam ettiği sorusunu cevaplamıyor.
chharvey

1

Tahminime göre daha açıklayıcı seçenekler isteniyordu ve ayrıca daha uzun seçeneklerle tek karakter seçeneklerinin tükenmesi konusunda endişelenmenize gerek kalmayacak.

Uzun seçenekler istediğinize karar verdikten sonra, en azından hem uzun hem de kısa seçenekleri desteklemeyi düşünüyorsanız, bir sorun yaşarsınız. Olumlu değilim, ama arcege 'nin cevabının neden - ve -' nin anahtarı olduğuna inanıyorum. Genel bir işleme rutini, örn. getopt_long (), tek bir komut satırı argümanının birden fazla seçenek içerip içeremeyeceğini bilmesi gerekir, örn. -ltr. Bu nedenle, bir işlem rutininin ikisini birbirinden ayırt edebilmesi gerekir. Tek bir tire okursam, -, sonra komut satırı argümanının geri kalanı birden fazla seçenekle eşleşebilir. Çift çizgi okursam, -, sonra komut satırı argümanının geri kalanının tek bir seçenekle eşleşmesi gerekir.

Sadece son zamanlarda getopt_long () 'u kullandım ve hatırlamak daha kolay ve kendi kendini belgelemek için uzun seçenekleri sevmeye başladım. Aşağıdaki iki komutu varsa:

. / toplayıcı -f 15

./aggregator - yıkama zamanı 15

İkincisi, uzun seçeneği kullananların daha açıklayıcı olduğunu söyleyebilirim.


0

İki yöntemin kullanılmasının birkaç nedeni olabilir. Biri elbette gelenek. Programcılar ve kullanıcılar insandır ve insanlar işlerin belirli bir şekilde çalışmasını bekler. Değiştirmek için bir neden yoksa (ve gerçekten, bir komut satırı için, değiştirmek için pek bir neden yoktur), o zaman yapmayın.

Bununla birlikte, tek bir kısa çizgiyi uzun bir seçenek için kullanan, hatta tümüyle tirelerden kurtulan araçlar olduğunu biliyorum. Bu araçlar ilk başta zor olabilir ve aksi takdirde birleşik bir sistemde siğiller gibi yapışma eğilimindedir.

İkisi arasındaki farkı öğrenirken (ve ikinci doğaya gelmeden önce), "kısa" kısa çizginin "kısa" seçeneklerle eşleştiğini, "uzun" (veya çift) kısa çizgilerin "uzun" eşleşmelerini her zaman hatırlatacağım seçenekler. Bu mantığın çift tire stilinin gelişiminde kullanılıp kullanılmadığını bilmiyorum, ama bu bir olasılık.

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.