Quando e como o traço duplo (-) foi introduzido como um delimitador de fim de opções no Unix / Linux?

45

Eu não acho que o shell / utilitários no histórico do Unix nem em algo como "recente" como 4.4BSD suportado usando um traço duplo (ou dois hífens consecutivos) como um fim do delimitador de opções . Com o FreeBSD , você pode ver, por exemplo, uma nota introduzida no rm manpages com o release 2.2.1 (1997). Mas esta é apenas a documentação para um comando.

Olhando para o mais antigo GNU fileutils changelog Eu posso encontrar, eu vejo isso 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 a Linux . É claro para explicar o fato de que você pode querer criar um arquivo com um nome que contenha o mesmo número de dígitos que um tempo especificação (número decimal de oito ou dez dígitos) - em vez de especificar um timestamp para um arquivo existente ...

  • Então é posix.1 que introduz o traço duplo ( -- ) como um fim do delimitador de opções em shells Unix?
  • Tudo começou porque algumas pessoas queriam usar dígitos em nomes de arquivos com touch no início dos anos 90 e, em seguida, isso continuou de forma fragmentada, um utilitário de cada vez por uma década?
  • Qual é o comentário espirituoso no changelog sobre?
  • Quando era Diretriz 10 ( O argumento - deveria ser aceito como um delimitador indicando o fim das opções. [...] ) introduzido no POSIX Sintaxe do utilitário ?

1. Ao contrário de this isto é, documentando o longas opções em todos os comandos de uso global, o qual não é relacionado. Por outro lado, você pode ver uma referência ao delimitador aparecer em algo como GNU rm.c em 2000 como um comentário, antes de ser exposta para o usuário final em 2005 (a função diagnose_leading_hyphen ). Mas isso é tudo muito mais tarde e é sobre um caso de uso muito específico.

    
por jus cogens prime 29.07.2014 / 08:45

1 resposta

32

Até onde eu sei, o uso de -- como marcador de fim de opções começa com sh e getopt no System III Unix (1980).

De acordo com essa história da família Bourne Shell , o Bourne Shell primeiro apareceu em Versão 7 Unix (1979). Mas não tinha como set separar as opções dos argumentos . Então, o shell Bourne original poderia fazer:

  • set -e - ativar o modo de sair no erro
  • set arg1 arg2 ... - define os parâmetros posicionais $1=arg1 , $2=arg2 , etc.

Mas: set arg1 -e arg2 daria a você $1=arg1 , $2=arg2 e ativar a saída-em-erro . Ops.

System III Unix (1980) corrigiu esse bug e introduziu getopt . De acordo com a página de manual do getopt :

NAME
   getopt - parse command options

SYNOPSIS
   set -- 'getopt optstring $∗'

DESCRIPTION
   Getopt is used to break up options in command lines for easy parsing by
   shell procedures, and to check  for  legal  options.   Optstring  is  a
   string  of  recognized  option letters (see getopt(3C)); if a letter is
   followed by a colon, the option is expected to have an  argument  which
   may or may not be separated from it by white space.  The special option
   -- is used to delimit the end of the options.  Getopt will place --  in
   the  arguments  at  the  end  of  the  options, or recognize it if used
   explicitly.  The shell arguments ($1 $2 . . .) are reset so  that  each
   option  is  preceded  by a - and in its own shell argument; each option
   argument is also in its own shell argument.

Tanto quanto eu posso dizer, esse é o lugar primeiro que aparece.

A partir daí, parece que outros comandos adotaram a convenção -- para resolver ambigüidades de análise de argumentos (como os exemplos com touch e rm que você cita acima) durante os dias normais e sem padrão da década de 1980. / p>

Algumas dessas adoções parciais foram codificadas em POSIX.1 (1988), que é onde o comentário do changelog sobre o "POSIX-required kludge" vem.

Mas não foi até POSIX.2 (1992) que as Diretrizes de Sintaxe do Utilitário foram adotadas, que contêm a famosa Diretriz 10:

Guideline 10:    The argument "--" should be accepted as a delimiter
                 indicating the end of options.  Any following
                 arguments should be treated as operands, even if they
                 begin with the '-' character.  The "--" argument
                 should not be used as an option or as an operand.

E é aí que passa de ser um "kludge" para uma recomendação universal.

    
por 31.07.2014 / 21:41