La citazione di Raymond di @jasonwryan contiene alcune informazioni utili, ma inizia nel mezzo della storia:
- Tieni presente che Unix è iniziato come una versione a ambito ridotto di Multics e che nel corso della sua storia, le funzionalità di Unix erano spesso imitazioni o adattamenti di funzionalità viste e utilizzate su altri sistemi.
- Il
'-'
carattere opzione è stato utilizzato in Multics. Bitsavers ha un manuale per i suoi comandi utente .
- Altri sistemi utilizzavano caratteri diversi, alcuni con una maggiore pretesa di essere più efficienti da tastiera (come quelli
'/'
usati per TOPS e VMS) e altri meno (come quelli '('
usati in VM / SP CMS).
- Le opzioni Multics erano multi-carattere, ad esempio parole chiave separate da trattino basso.
- Le opzioni Multics più lunghe hanno spesso una forma abbreviata, più breve, come
-print
vs -pr
(pagina 3-8).
- Le opzioni Unix erano a carattere singolo e, dopo diversi anni,
getopt
furono introdotte. Poiché non faceva parte della versione originale di Unix, esistono utilità che non sono state utilizzate getopt
e sono rimaste così come sono. Ma aver getopt
contribuito a rendere coerenti i programmi.
D'altra parte, le opzioni Unix che utilizzavano getopt
erano a carattere singolo. Altri sistemi, in particolare tutti quelli più grandi, utilizzavano parole chiave. Alcuni (non tutti) hanno permesso di abbreviare quelle parole chiave , ovvero non tutti i caratteri forniti purché l'opzione non fosse ambigua. Ci sono insidie in quel test per l'ambiguità. Per esempio:
- all'inizio del 1985, stavo lavorando a un programma che doveva essere portato su PrimOS . Gli sviluppatori di Prime hanno gareggiato con diverse altre società offrendo un linguaggio di comando che (ha cercato di) imitare ognuna di quelle altre, fornendo i comandi più comunemente usati da ciascuna. Ovviamente, hanno supportato le abbreviazioni (così come VMS). Dopo aver letto la guida in linea, ho digitato
sta
, pensando di ottenere status
. Era l'abbreviazione di start
, e non avendo dato nulla per iniziare , l'interprete dei comandi mi ha disconnesso.
- X Toolkit (utilizzato da xterm ) consente opzioni abbreviate. Per usarlo efficacemente in xterm, deve preelaborare i parametri di comando da preferire
-v
(per la versione) rispetto a -vb
(visual bell). X Toolkit non ha un modo diretto per specificare un'opzione preferita in caso di ambiguità.
A causa di questo potenziale di ambiguità, alcuni sviluppatori preferiscono non consentire le abbreviazioni. Lynx , ad esempio, utilizza opzioni multi-carattere senza consentire abbreviazioni.
Non tutti i programmi utilizzati getopt
: tar
e ps
non lo hanno fatto. Nemmeno rcs
(o sccs
), come puoi vedere notando dove il trattino era facoltativo e i valori delle opzioni erano facoltativi.
Tenendo conto di tutto ciò, gli sviluppatori GNU hanno adattato le opzioni di parole chiave utilizzate in altri sistemi estendendosi getopt
per fornire una versione lunga di ciascuna opzione breve. Ad esempio, dice il log delle modifiche di textutils 1.0
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.
La modifica di fileutils era precedente:
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.
e qualcuno potrebbe trovarne uno ancora prima, ma sembra che l'intestazione del file mostri la prima data:
/* Getopt for GNU.
Copyright (C) 1987, 1989 Free Software Foundation, Inc.
che è (per esempio) in concomitanza con X Toolkit (1987). La maggior parte dei programmi di utilità Unix con cui si ha familiarità (come ls
, ps
) ha utilizzato le opzioni esistenti a carattere singolo che richiedono visite periodiche al manuale. Durante l'introduzione getopt_long
, gli sviluppatori GNU non hanno fatto ciò aggiungendo prima nuove opzioni; hanno iniziato tabulando le opzioni esistenti e fornendo un'opzione lunga corrispondente.
Poiché si stavano aggiungendo a un repertorio esistente, c'era (di nuovo) il problema del conflitto con le opzioni esistenti. Per evitarlo, hanno cambiato la sintassi, usando due trattini prima di lunghe opzioni.
Questi programmi continuano a essere utilizzati getopt_long
in questo modo per i soliti motivi:
- gli script dipendono dalle opzioni; gli sviluppatori non sono ansiosi di infrangere gli script
- c'è uno standard di codifica scritto (che può essere efficace)
- nessuno ha escogitato un set di strumenti in competizione che è marcatamente incompatibile (sia gli sviluppatori BSD che gli sviluppatori GNU copiano i nomi delle opzioni gli uni dagli altri)
-
è tecnicamente chiamato un trattino . Usiamo la parola "trattino" per riferirci al trattino (-) nella maggior parte dei casi, e talvolta al trattino (-), ma nessuno dei due è un trattino (-).