Eu não acho que o shell / utilitários no Unix histórico nem em algo tão "recente" quanto o 4.4BSD suportasse o uso de um traço duplo (ou dois hífens consecutivos) como um delimitador de final de opções . Com o FreeBSD , você pode ver, por exemplo, uma nota introduzida nas rm
páginas de manual com a versão 2.2.1 (1997). Mas esta é apenas a documentação para um comando.
Olhando para o changelog mais antigo do arquivo GNU que posso encontrar, vejo este 1 (ligeiramente 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.
Isso é anterior ao Linux . É claramente necessário levar em consideração o fato de que você pode querer criar um arquivo com um nome que contenha o mesmo número de dígitos que uma especificação de tempo (número decimal de oito ou dez dígitos) - em vez de especificar um carimbo de data e hora para um arquivo existente ...
- Então, foi o posix.1 que introduziu o traço duplo (
--
) como um delimitador de fim de opções nos shells do Unix? - Tudo isso começou porque algumas pessoas queriam usar dígitos nos nomes de arquivos
touch
no início dos anos 90 e isso continuou de forma fragmentada, um utilitário por vez durante uma década? - Sobre o que é o comentário espirituoso no changelog?
- Quando a Diretriz 10 ( O argumento - deve ser aceito como delimitador, indicando o final das opções.) [...] ) foi introduzida na sintaxe do utilitário POSIX ?
1. Em oposição a isso, ou seja, documentando as opções longas em todos os comandos de uso global, o que não é relacionado. Por outro lado, você pode ver referência ao delimitador aparecem em algo como GNU rm.c em 2000 como um comentário, antes de ser exposto para o usuário final em 2005 (o diagnose_leading_hyphen função). Mas tudo isso é muito mais tarde e trata de um caso de uso muito específico.
getopt
suporte--
.getopt
foi escrito no início dos anos 80. Se alguém puder obter o artigo da Uniforum '85, isso pode dar um pouco de história.--
.Respostas:
Tanto quanto posso dizer, o uso de
--
como marcador de fim de opções começa comsh
egetopt
no System III Unix (1980).De acordo com essa história da família Bourne Shell , o Bourne Shell apareceu pela primeira vez na Versão 7 Unix (1979). Mas ele não tem um caminho para
set
a separar opções de argumentos . Portanto, o shell Bourne original poderia fazer:set -e
- ativar o modo de saída com erroset arg1 arg2 ...
- define os parâmetros de posição$1=arg1
,$2=arg2
etc.Mas:
set arg1 -e arg2
daria a você$1=arg1
,$2=arg2
e ativar a saída com erro . Ops.O System III Unix (1980) corrigiu esse bug e o introduziu
getopt
. De acordo comgetopt
a página do manual :Até onde eu sei, esse é o primeiro lugar que aparece.
A partir daí, parece que outros comandos adotaram a
--
convenção para resolver ambiguidades de análise de argumentos (como os exemplos comtouch
erm
você cita acima) ao longo dos dias selvagens e sem padrões da década de 1980.Algumas dessas adoções fragmentadas foram codificadas no POSIX.1 (1988), que é de onde vem o comentário do registro de alterações sobre o "kludge necessário para o POSIX".
Mas foi apenas no POSIX.2 (1992) que as Diretrizes de sintaxe de utilitário foram adotadas, que contêm a famosa Diretriz 10:
E é aí que passa de ser um "clamor" a uma recomendação universal.
fonte
getopt
não podia. Vou ler mais sobre isso! Obrigado novamente!