A citação de Raymond por @jasonwryan tem algumas informações úteis, mas começa no meio da história:
- Lembre-se de que o Unix começou como uma versão de escopo reduzido do Multics, e que, ao longo de sua história, os recursos do Unix eram frequentemente imitações ou adaptações dos recursos vistos e usados em outros sistemas.
- O
'-'
caractere de opção foi usado no Multics. O Bitsavers possui um manual para seus comandos de usuário .
- Outros sistemas usavam caracteres diferentes, alguns com mais pretensão de serem mais eficientes no pressionamento de teclas (como
'/'
usado para TOPS e VMS) e outros menos (como '('
usado no VM / SP CMS).
- As opções do Multics eram de vários caracteres, por exemplo, palavras-chave separadas por sublinhado.
- As opções mais longas do Multics costumavam ter uma forma mais curta e abreviada, como
-print
vs -pr
(página 3-8).
- As opções do Unix eram de caráter único e, após vários anos,
getopt
foram introduzidas. Por não fazer parte do Unix original, existem utilitários que não foram utilizados getopt
e foram deixados como estão. Mas, tendo getopt
ajudado a tornar os programas consistentes.
Por outro lado, as opções do Unix usando getopt
eram de um caractere. Outros sistemas, em particular todos os maiores, usavam palavras-chave. Alguns (nem todos) permitiram que essas palavras-chave fossem abreviadas , ou seja, nem todos os caracteres foram fornecidos desde que a opção fosse inequívoca. Existem armadilhas nesse teste de ambiguidade. Por exemplo:
- No início de 1985, eu estava trabalhando em um programa que precisava ser portado para o PrimOS . Os desenvolvedores da Prime competiram com várias outras empresas, oferecendo uma linguagem de comando que (tentava) imitar cada uma dessas outras, fornecendo os comandos mais usados por cada uma delas. Obviamente, eles apoiaram abreviações (como o VMS). Depois de ler a ajuda online, digitei
sta
, pensando em receber status
. Essa era a abreviação de start
, e não tendo dado nada para começar , o intérprete de comando me desconectou.
- O X Toolkit (usado pelo xterm ) permite opções abreviadas. Para usá-lo efetivamente no xterm, é necessário pré-processar os parâmetros de comando para preferir
-v
(para versão) sobre -vb
(visual bell). O X Toolkit não tem maneira direta de especificar uma opção preferida quando houver uma ambiguidade.
Devido a esse potencial de ambiguidade, alguns desenvolvedores preferem não permitir abreviações. O Lynx , por exemplo, usa opções de vários caracteres sem permitir abreviações.
Nem todos os programas utilizados getopt
: tar
e ps
não. Nem rcs
(ou sccs
), como você pode ver, observando onde o traço era opcional e os valores das opções eram opcionais.
Levando tudo isso em consideração, os desenvolvedores do GNU adaptaram as opções de palavras-chave usadas em outros sistemas, estendendo getopt
- se para fornecer uma versão longa de cada opção curta. Por exemplo, o changelog do textutils 1.0 diz
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.
A mudança no fileutils foi 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.
e alguém pode encontrar um ainda mais cedo, mas parece que o cabeçalho do arquivo mostra a data mais antiga:
/* Getopt for GNU.
Copyright (C) 1987, 1989 Free Software Foundation, Inc.
que é (por exemplo) simultâneo com o X Toolkit (1987). A maioria dos utilitários Unix com os quais você está familiarizado (como ls
, ps
) usava as opções de caractere único existentes que requerem visitas periódicas ao manual. Ao introduzir getopt_long
, os desenvolvedores GNU não fazer isso, primeiro adicionando novas opções; eles começaram tabulando as opções existentes e fornecendo uma opção longa correspondente.
Como eles estavam adicionando a um repertório existente, havia (novamente) o problema de conflito com as opções existentes. Para evitar isso, eles mudaram a sintaxe, usando dois traços antes das opções longas.
Esses programas continuam a ser utilizados getopt_long
dessa maneira pelos motivos usuais:
- scripts dependem das opções; desenvolvedores não estão ansiosos para quebrar scripts
- existe um padrão de codificação escrito (que pode ser eficaz)
- ninguém criou um conjunto de ferramentas concorrentes que é marcadamente incompatível (os desenvolvedores do BSDs e do GNU copiam os nomes das opções)
-
é tecnicamente chamado de hífen . Usamos a palavra "traço" para nos referir ao traço em (-) na maioria dos casos, e às vezes o traço (-), mas nenhum dos quais é um hífen (-).