No creo que el shell / utilidades en Unix histórico ni en algo tan "reciente" como 4.4BSD sea compatible con un guión doble (o dos guiones consecutivos) como final delimitador de opciones . Con FreeBSD , puede ver, por ejemplo, una nota introducida en las rm
páginas de manual con la versión 2.2.1 (1997). Pero esto es solo la documentación para un comando.
Mirando el registro de cambios de archivos de GNU más antiguo que puedo encontrar, veo esto 1 (ligeramente alterado):
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.
Esto es anterior a Linux . Claramente es para tener en cuenta el hecho de que es posible que desee crear un archivo con un nombre que contenga el mismo número de dígitos que una especificación de tiempo (número decimal de ocho o diez dígitos), en lugar de especificar una marca de tiempo para un archivo existente ...
- Entonces, ¿es posix.1 que introdujo el doble guión (
--
) como un fin delimitador de opciones en shells de Unix? - ¿Comenzó todo esto porque algunas personas querían usar dígitos en los nombres de archivo a
touch
principios de los 90 y luego esto continuó de manera gradual, una utilidad a la vez durante una década? - ¿De qué se trata el enérgico comentario en el registro de cambios?
- ¿Cuándo se introdujo la directriz 10 ( El argumento - debería aceptarse como un delimitador que indica el final de las opciones. [...] ) a la sintaxis de la utilidad POSIX ?
1. A diferencia de esto, es decir, documentar las opciones largas en todos los comandos de uso a nivel mundial, lo que no está relacionado. Por otro lado, puede ver que la referencia al delimitador aparece en algo como GNU rm.c en 2000 como un comentario, antes de exponerse al usuario final en 2005 (la función diagnostose_leading_hyphen ). Pero todo esto es mucho más tarde y se trata de un caso de uso muy específico.
getopt
soporte--
.getopt
se escribió a principios de la década de 1980. Si alguien puede obtener el papel getopt de Uniforum '85, eso podría dar algo de historia.--
.Respuestas:
Por lo que puedo decir, el uso de
--
como marcador de fin de opciones comienza consh
ygetopt
en System III Unix (1980).Según esta historia de la familia Bourne Shell , Bourne Shell apareció por primera vez en la Versión 7 Unix (1979). Pero no tuvo un camino para
set
que separe las opciones de argumentos . Entonces, el shell Bourne original podría hacer:set -e
- activar el modo de salida en caso de errorset arg1 arg2 ...
- establece los parámetros posicionales$1=arg1
,$2=arg2
, etc.Pero:
set arg1 -e arg2
le daría$1=arg1
,$2=arg2
y activar la salida-on-error . WhoopsSystem III Unix (1980) reparó ese error y lo introdujo
getopt
. De acuerdo congetopt
la página del manual de :Por lo que puedo decir, ese es el primer lugar que aparece.
A partir de ahí, parece que otros comandos adoptaron la
--
convención para resolver las ambigüedades de análisis de argumentos (como los ejemplos contouch
y querm
usted cita arriba) a lo largo de los días salvajes y sin estándar de la década de 1980.Algunas de estas adopciones poco sistemáticas se codificaron en POSIX.1 (1988), que es de donde proviene el comentario del registro de cambios sobre el "kludge requerido por POSIX".
Pero no fue hasta POSIX.2 (1992) que se adoptaron las Pautas de sintaxis de utilidades , que contienen la famosa Pauta 10:
Y ahí es donde pasa de ser un "error" a una recomendación universal.
fuente
getopt
no podían. ¡Leeré más sobre esto! ¡Gracias de nuevo!