Opções de passagem para um programa: qual é a convenção para um traço vs dois?

7

Alguns programas terão opções como esta:

$ someprogram -orange apple

E outros programas usarão algo assim:

$ otherprogram --orange apple

Existe uma "regra" ou convenção para isso no Linux / Unix / OSX?

    
por Closure Cowboy 20.03.2011 / 21:59

2 respostas

22

O mais comum é o estilo getopt do GNU, com um traço para opções curtas e dois traços para opções longas.

  • Inicialmente, os programas Unix utilizavam opções de letras únicas precedidas por um único traço e, opcionalmente, agrupadas:

    ls -laF
    
    ls -l -a -F
    

    Os dois comandos acima são iguais.

    Quando uma opção recebe um valor, ela substitui o empacotamento: Em gpg -aofoo.gpg , -a e -o são opções e foo.gpg é o valor atribuído a -o .

  • A maioria deles, de qualquer forma.

    tar cvzf é uma visão comum. As versões atuais aceitam tar -cvzf também e, dependendo de você adicionar o traço, os argumentos serão interpretados de maneiras muito diferentes. Por exemplo, esses dois significam a mesma coisa (observe como as opções sem painel não são imediatamente antes de seu valor):

    tar -xf file.tgz -vzO /etc/passwd /var/backups
    
    tar xfvzO file.tgz /etc/passwd /var/backups
    

    O BSD ps sempre usa - ; O SysV ps nunca faz. A versão do Linux aceita ambas as versões e altera seu comportamento dependendo se uma opção foi prefixada com um traço. (Diferentemente do exemplo de tar acima, ps também muda a opção significados ).

  • Os programas X11 usam opções longas precedidas por um único traço ou, às vezes, um sinal de mais:

    xterm -class FooTerm +vb -u8
    

    Isso define as opções class e u8 e desmarca a opção vb .

    O estilo X11 é incompatível com o pacote de opções.

  • Mais tarde, opções longas foram adicionadas ao GNU getopt() de uma maneira compatível com as opções de uma letra.

    gpg -se --no-armor --output=signed.gpg
    

    Isso define -s , -e e --no-armor (que é o oposto de --armor ).

    Normalmente, --output=signed.gpg e --output signed.gpg são equivalentes. (Mas nem sempre - por exemplo, curl não aceita o primeiro, apenas o último).

    (Se bem me lembro, as opções longas usavam + como o prefixo antes de ser alterado para -- .)

  • A especificação POSIX tem uma seção Sintaxe do argumento do utilitário , que descreve a opções de caracteres.

A maioria dos programas do Windows usa seus próprios analisadores, enlouquecendo os usuários.

  • Alguns exigem /a /b /c , outros permitem o estilo VMS /a/b/c , mas outros preferem o estilo Unix /abc .
  • A maioria usa / como prefixo, alguns também aceitam - , outros aceitam somente - .
  • Os valores podem ser fornecidos como /foo bar , /foo=bar , /foo:bar .
  • Normalmente, os espaços podem ser /quoted "like this" , mas alguns programas consideram o " como um caractere literal. (Essa é uma desvantagem de permitir que o programa faça sua própria divisão de palavras; no Unix, isso é feito pelo shell.)
  • Os programas de plataforma cruzada podem usar uma implementação de getopt .
por 20.03.2011 / 22:13
5

Geralmente, o primeiro é encontrado em programas antigos que estão muito bem entrincheirados para mudar. Esse tipo de opções longas são incompatíveis com a função getopt() padrão.

O segundo estilo foi introduzido pelo GNU getopt_long() e é compatível com os padrões existentes que esperam que o primeiro estilo seja agrupado em opções curtas (ou seja, -orange deve significar -o -r -a -n -g -e ). Este estilo de longa opção é strongmente preferido.

    
por 20.03.2011 / 22:12