Traços únicos `-` para opções de caractere único, mas traços duplos` --` para palavras?

51

De onde surgiu a convenção de usar traços simples para letras e traços duplos para palavras e por que continua a ser usado?

Por exemplo, se eu digitar ls --help, você vê:

  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
      --author               with -l, print the author of each file
  -b, --escape               print octal escapes for nongraphic characters
      --block-size=SIZE      use SIZE-byte blocks
  -B, --ignore-backups       do not list implied entries ending with ~
...

Eu tentei pesquisar no Google - and -- conventionmesmo com citações com pouco sucesso.

Larry
fonte
6
Apenas sendo exigente aqui, mas o personagem -é 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 (-).
chharvey
4
Isso realmente me incomoda quando programas conhecidos não seguem a convenção:java -version
Kimberly W
4
@Jamil Yeah. Eu acabei aqui me perguntando por que é issofind . -delete
Krzysztof Wende 24/05
A idéia disso é para que você possa escrever coisas como o -abque ativa ambos ae b. Sem o traço duplo, -helpativaria h, e, l, e popções.
Aaron Franke

Respostas:

61

Na arte da programação para Unix, Eric Steven Raymond descreve como essa prática evoluiu:

Na tradição original do Unix, as opções de linha de comando são letras únicas precedidas por um único hífen ... O estilo original do Unix evoluiu nos teletipos lentos do ASR-33, que tornaram a dispersão uma virtude; portanto, as opções de letra única. Manter pressionada a tecla Shift exigia esforço real; portanto, a preferência por letras minúsculas e o uso de “-” (em vez do talvez mais lógico “+”) para ativar as opções.

O estilo GNU usa palavras-chave de opção (em vez de letras de palavras-chave) precedidas por dois hífens. Ele evoluiu anos depois, quando alguns utilitários GNU bastante elaborados começaram a ficar sem chaves de opção de letra única ( isso constituía um remendo para o sintoma, não uma cura para a doença subjacente ). Ele continua popular porque as opções do GNU são mais fáceis de ler do que a sopa de letrinhas dos estilos mais antigos. 1 1

[1] http://www.faqs.org/docs/artu/ch10s05.html

jasonwryan
fonte
Observe que getopt () foi publicado pela primeira vez em 1985, mas o UNOS (o clone mais antigo do UNIX) publicou getargs () em 1982 já (foi escrito em 1980) e getargs () suporta opções curtas e opções de traço único longo (estilo Multics). O UNOS usou maciçamente opções longas de traço único e o UNOS foi escrito por ex-funcionários da AT&T. Em 1988, o GNU lançou opções com traço duplo, apesar de o UNOS ter verificado que as opções com traço único funcionam muito bem.
schily
28

Uma razão para continuar usando as opções de letra única é porque elas podem ser combinadas: ls -ltré muito mais fácil digitar do que ls --sort=time --reverse --format=long. Existem várias vezes em que ambos são bons de usar. Quanto à procura deste tópico, tente "convenção de opções de linha de comando unix".

Arcege
fonte
11
+1 Obrigado, isso realmente ajuda com a lógica por trás da implementação.
Larry
Como o UNIX ls não entende ls --sort=time --reverse --format=long, não é uma boa idéia mencionar esse método não padrão.
schily
6

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 -printvs -pr(página 3-8).
  • As opções do Unix eram de caráter único e, após vários anos, getoptforam introduzidas. Por não fazer parte do Unix original, existem utilitários que não foram utilizados getopte foram deixados como estão. Mas, tendo getoptajudado a tornar os programas consistentes.

Por outro lado, as opções do Unix usando getopteram 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: tare psnã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_longdessa 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)
Thomas Dickey
fonte
3

Na interface de linha de comando da wikipedia , é relatado:

Em sistemas tipo Unix, o hífen ASCII-menos é comumente usado para especificar opções. O caractere geralmente é seguido por uma ou mais letras. Um argumento que é um único hífen – menos por si só, sem nenhuma letra, geralmente especifica que um programa deve manipular dados provenientes da entrada padrão ou enviar dados para a saída padrão. Dois caracteres hífen – menos (-) são usados ​​em alguns programas para especificar "opções longas" onde nomes de opções mais descritivos são usados. Esse é um recurso comum do software GNU.

enzotib
fonte
Isso não responde à pergunta de onde veio a convenção e por que ela continua a ser usada.
chharvey
1

Meu palpite é que opções mais descritivas foram desejadas e também com opções mais longas, você não precisará se preocupar em ficar sem opções de caracteres únicos.

Depois de decidir que deseja opções longas, há um problema, pelo menos se você planeja oferecer suporte a opções longas e curtas. Não sou positivo, mas acredito que a resposta da arcege é a chave do porquê - e -. Uma rotina de processamento genérica, por exemplo. getopt_long (), precisaria saber se um único argumento de linha de comando poderia conter várias opções, por exemplo. -ltr. Assim, uma rotina de processamento precisaria ser capaz de diferenciar entre os dois. Se eu ler um único traço, -, o restante do argumento da linha de comandos poderá corresponder a várias opções. Se eu ler um traço duplo, -, o restante do argumento da linha de comandos deverá corresponder a uma única opção.

Recentemente, usei getopt_long () e estou começando a gostar de opções longas, pois elas são mais fáceis de lembrar e se auto-documentam. Se eu tiver os seguintes dois comandos:

./aggregator -f 15

./aggregator --flush-time 15

Eu diria que o segundo usando a opção longa é mais auto-explicativo.

nickdu
fonte
0

Provavelmente, existem alguns motivos pelos quais os dois métodos são usados. Uma, é claro, é tradição. Programadores e usuários são humanos, e os humanos esperam que as coisas funcionem de uma certa maneira. Se não há motivos para mudar (e realmente, para uma linha de comando, não há muitos motivos para mudar), então não faça.

Dito isto, eu sei que existem ferramentas por aí que usam o hífen único por uma longa opção ou até mesmo se livram dos hífens. Essas ferramentas podem ser difíceis no começo e tendem a se destacar como verrugas em um sistema unificado.

Quando eu aprendia a diferença entre os dois (e antes de se tornar uma segunda natureza), eu sempre me lembrava que o hífen "curto" corresponde às opções "curtas", enquanto o hífen "longo" (ou duplo) corresponde ao "longo" opções Não sei se esse raciocínio foi usado no desenvolvimento do estilo de hífen duplo, mas é uma possibilidade.

Kevin Lacquement
fonte