La cita de Raymond de @jasonwryan tiene información útil, pero comienza en el medio de la historia:
- Tenga en cuenta que Unix comenzó como una versión de alcance reducido de Multics, y que a lo largo de su historia, las características en Unix fueron a menudo imitaciones o adaptaciones de características vistas y utilizadas en otros sistemas.
- El
'-'
carácter de opción se usó en Multics. Bitsavers tiene un manual para sus comandos de usuario .
- Otros sistemas utilizaron diferentes caracteres, algunos con más pretensiones de ser más eficientes al presionar teclas (como los que se
'/'
usan para TOPS y VMS) y otros menos (como los que se '('
usan en VM / SP CMS).
- Las opciones de multics eran de varios caracteres, por ejemplo, palabras clave separadas por guiones bajos.
- Las opciones de Multics más largas con frecuencia tenían una forma abreviada más corta, como
-print
vs -pr
(página 3-8).
- Las opciones de Unix eran de un solo carácter, y después de varios años,
getopt
se introdujo. Debido a que no era parte del Unix original, hay utilidades que no se usaron getopt
y se dejaron como están. Pero haber getopt
ayudado a hacer que los programas sean consistentes.
Por otro lado, las opciones de Unix usando getopt
eran de un solo carácter. Otros sistemas, en particular todos los más grandes, usaban palabras clave. Algunos (no todos) permitieron abreviar esas palabras clave , es decir, no se proporcionaron todos los caracteres siempre que la opción no fuera ambigua. Hay dificultades en esa prueba de ambigüedad. Por ejemplo:
- A principios de 1985, estaba trabajando en un programa que tenía que ser portado a PrimOS . Los desarrolladores de Prime compitieron con varias otras compañías al ofrecer un lenguaje de comandos que (intentó) imitar a cada uno de esos otros, proporcionando los comandos más utilizados de cada uno. Por supuesto, admitieron abreviaturas (al igual que VMS). Después de leer la ayuda en línea, escribí
sta
, pensando en obtener status
. Esa fue la abreviatura de start
, y al no haber dado nada para comenzar , el intérprete de comandos me desconectó.
- El X Toolkit (utilizado por xterm ) permite opciones abreviadas. Para usar esto efectivamente en xterm, tiene que preprocesar los parámetros del comando para preferir
-v
(para la versión) sobre -vb
(campana visual). X Toolkit no tiene una forma directa de especificar una opción preferida cuando existe una ambigüedad.
Debido a este potencial de ambigüedad, algunos desarrolladores prefieren no permitir abreviaturas. Lynx , por ejemplo, utiliza opciones de varios caracteres sin permitir abreviaturas.
No todos los programas utilizados getopt
: tar
y ps
no lo hicieron. Tampoco rcs
(o sccs
), como puede ver al observar dónde el guión era opcional, y los valores de las opciones eran opcionales.
Teniendo todo esto en cuenta, los desarrolladores de GNU adaptaron las opciones de palabras clave utilizadas en otros sistemas extendiéndose getopt
para proporcionar una versión larga de cada opción corta. Por ejemplo, el registro de cambios de textutils 1.0 dice
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.
El cambio en fileutils fue anterior:
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.
y alguien puede encontrar uno aún antes, pero parece que el encabezado del archivo muestra la fecha más temprana:
/* Getopt for GNU.
Copyright (C) 1987, 1989 Free Software Foundation, Inc.
que es (por ejemplo) concurrente con el X Toolkit (1987). La mayoría de las utilidades de Unix con las que está familiarizado (como ls
, por ejemplo ps
) usaban las opciones existentes de un solo carácter que requieren visitas periódicas al manual. Al presentar getopt_long
, los desarrolladores de GNU no hicieron esto al agregar primero nuevas opciones; que comenzaron por la tabulación de las opciones existentes y proporcionar una opción a largo juego.
Debido a que se estaban agregando a un repertorio existente, existía (nuevamente) el problema del conflicto con las opciones existentes. Para evitar esto, cambiaron la sintaxis, usando dos guiones antes de las opciones largas.
Estos programas continúan utilizándose getopt_long
de esta manera por los motivos habituales:
- los guiones dependen de las opciones; los desarrolladores no están ansiosos por romper los scripts
- hay un estándar de codificación escrito (que puede ser efectivo)
- a nadie se le ocurrió un conjunto de herramientas de la competencia que sea notablemente incompatible (tanto los desarrolladores BSD como GNU copian los nombres de las opciones entre sí)
-
técnicamente se llama guión . Usamos la palabra "guión" para referirnos al guión em (-) en la mayoría de los casos, y a veces al guión en (-), pero ninguno de los cuales es un guión (-).