La citation de Raymond par @jasonwryan contient des informations utiles, mais commence au milieu de l'histoire:
- Gardez à l'esprit qu'Unix était à l'origine une version réduite de Multics et que tout au long de son histoire, les fonctionnalités d'Unix étaient souvent des imitations ou des adaptations de fonctionnalités vues et utilisées sur d'autres systèmes.
- Le
'-'
caractère d'option a été utilisé dans Multics. Bitsavers a un manuel pour ses commandes utilisateur .
- D'autres systèmes utilisaient des caractères différents, certains prétendant davantage être plus efficaces au clavier (tels que ceux
'/'
utilisés pour TOPS et VMS) et d'autres moins (comme ceux '('
utilisés dans les CMS VM / SP).
- Les options Multics comportaient plusieurs caractères, par exemple des mots-clés séparés par un trait de soulignement.
- Les options Multics plus longues ont souvent une forme abrégée et abrégée, telle que
-print
vs -pr
(page 3-8).
- Les options Unix étaient à caractère unique et, après plusieurs années, ont
getopt
été introduites. Comme il ne faisait pas partie de l’Unix original, il existe des utilitaires qui n’ont pas été utilisés getopt
et qui sont restés tels quels . Mais avoir getopt
aidé à rendre les programmes cohérents.
D'autre part, les options Unix utilisées getopt
étaient à caractère unique. D'autres systèmes, en particulier les plus grands, ont utilisé des mots-clés. Certains (pas tous) ont autorisé l’ abréviation de ces mots-clés , c’est-à-dire que tous les caractères n'étaient pas fournis tant que l’option était sans ambiguïté. Ce test de l'ambiguïté présente des pièges. Par exemple:
- Au début de 1985, je travaillais sur un programme qui devait être porté sur PrimOS . Les développeurs de Prime ont concurrencé plusieurs autres entreprises en proposant un langage de commande imitant chacune d’elles, en fournissant les commandes les plus couramment utilisées. Bien sûr, ils ont soutenu les abréviations (tout comme VMS). Après avoir lu l'aide en ligne, j'ai tapé
sta
, pensant obtenir status
. C'était l'abréviation de start
, et n'ayant rien donné à commencer , l'interprète de commande m'a déconnecté.
- Le X Toolkit (utilisé par xterm ) permet des options abrégées. Pour utiliser cela efficacement dans xterm, il doit prétraiter les paramètres de commande de préférence
-v
(pour la version) par rapport à -vb
(cloche visuelle). X Toolkit n’a aucun moyen direct de spécifier une option préférée en cas d’ambiguïté.
En raison de ce risque d'ambiguïté, certains développeurs préfèrent ne pas autoriser les abréviations. Lynx , par exemple, utilise des options multi-caractères sans autoriser les abréviations.
Tous les programmes ne sont pas utilisés getopt
: tar
et ps
ne l'ont pas été. Ni rcs
(ou sccs
) non plus, comme vous pouvez le constater en notant où le tiret était facultatif et les valeurs d’option facultatives.
Tenant compte de tout cela, les développeurs GNU ont adapté les options de mot-clé utilisées dans d’autres systèmes en getopt
offrant une version longue de chaque option courte. Par exemple, textutils 1.0 changelog dit
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.
Le changement de fileutils était plus tôt:
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.
et quelqu'un peut en trouver un encore plus tôt, mais il semble que l'en-tête de fichier indique la date la plus proche:
/* Getopt for GNU.
Copyright (C) 1987, 1989 Free Software Foundation, Inc.
qui est (par exemple) concurrente de X Toolkit (1987). La plupart des utilitaires Unix avec lesquels vous êtes habitués (tels que ls
, ps
) ont utilisé les options existantes à un caractère qui nécessitent des visites périodiques du manuel. Lors de l’introduction getopt_long
, les développeurs GNU ne l’avaient pas fait en ajoutant d’ abord de nouvelles options; ils ont commencé par tabuler les options existantes et en fournissant une option longue correspondante.
Parce qu'ils ajoutaient à un répertoire existant, il y avait (encore une fois) le problème du conflit avec les options existantes. Pour éviter cela, ils ont modifié la syntaxe en utilisant deux tirets avant les options longues.
Ces programmes continuent à être utilisés getopt_long
de cette manière pour les raisons habituelles:
- les scripts dépendent des options; les développeurs ne sont pas soucieux de casser les scripts
- il y a une norme de codage écrite (qui peut être efficace)
- personne n'a mis au point un ensemble d'outils concurrents qui est nettement incompatible (les développeurs BSD et GNU copient les noms d'options entre eux)
-
s'appelle techniquement un trait d'union . Nous utilisons le mot "tiret" pour désigner le tiret em (-) dans la plupart des cas, et parfois le tiret en (()), mais ni l'un ni l'autre n'est un trait d'union (-).