Qual é a diferença entre um traço e dois traços para os parâmetros do prompt de comando?

60

Eu estava me perguntando por que alguns programas exigem que seus parâmetros de prompt de comando tenham dois traços na frente, enquanto alguns (a maioria) exigem apenas um traço na frente? / p>

Por exemplo, a maioria dos programas tem esta aparência: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Considerando que alguns programas se parecem com isto: xmllint --valid toc.xml --noout

Qual é a razão pela qual alguns exigem dois traços em vez de um? Não faz sentido para todos se ater a um padrão (ou seja, um único traço serve).

    
por Pacerier 28.12.2011 / 08:02

5 respostas

16

Apenas faça ls --help e olhe para as opções, deveria ser óbvio para você.

Não tem nada a ver com parâmetros. Muitas opções têm uma forma curta e uma longa, e muitas têm uma e não a outra.

E também, em relação aos parâmetros, é simplesmente que, na forma longa, quando eles pegam um parâmetro, parece que está sempre com um igual. Mas, obviamente, os curtos podem pegar parâmetros da mesma forma que eles não usam iguais.

Aqui está um extrato de man ls ou ls --help. Observe como alguns têm uma forma longa sem um formato curto (--author, --block-size). Alguns têm uma forma curta sem uma forma longa (-c, -f, -g), e alguns têm uma forma longa e uma forma curta (-A / - quase-tudo, -b / - escape)

     -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 ~
 -c                         with -lt: sort by, and show, ctime (time of last
                              modification of file status information)
                              with -l: show ctime and sort by name
                              otherwise: sort by ctime
 -C                         list entries by columns
     --color[=WHEN]         control whether color is used to distinguish file
                              types.  WHEN may be 'never', 'always', or 'auto'
    
por 28.12.2011 / 18:01
31

Não existe um padrão generalizado. Existe alguma consistência, e. em programas GNU, mas você precisa verificar a documentação de cada programa.

Citando Wikipédia , ênfase minha:

In Unix-like systems, the ASCII hyphen–minus is commonly used to specify options. The character is usually followed by one or more letters. An argument that is a single hyphen–minus by itself without any letters usually specifies that a program should handle data coming from the standard input or send data to the standard output. Two hyphen–minus characters ( -- ) are used on some programs to specify "long options" where more descriptive option names are used. This is a common feature of GNU software.

Normalmente, os hífens indicam um argumento predefinido. Eu acho que é usado para diferenciá-los de, e. nomes de arquivos ou outros rótulos que você possa usar como argumentos. Mas nem sempre é esse o caso (veja abaixo).

Você encontrará frequentemente o mesmo argumento disponível como opção curta e longa, como, por exemplo, em ls .

Alguns programas usam um único hífen para opções de um caractere e dois hífens para opções com vários caracteres, mas não todos (o GNU find vem à mente). Alguns programas possuem hifens opcionais ou ignoram-nos completamente ( tar ou BSD ps vem à mente).

Às vezes, as opções longas ( --foo ) exigem argumentos, enquanto as opções curtas ( -f ) não (ou pelo menos implicam um argumento padrão específico).

As opções curtas (por exemplo, cut -d ' ' ) podem ter argumentos, enquanto as opções longas (por exemplo, ls --all ) não têm necessariamente elas.

Para definir um comportamento específico de um programa, às vezes você precisa usar uma opção curta; para outros, você precisa usar uma opção longa e, para alguns, tem uma opção.

Em uma nota relacionada, alguns programas podem lidar com nenhum espaço em branco entre uma opção e seu argumento , enquanto outros não podem .

Como escrevi no começo, não há um comportamento ou padrão comum. Muitas vezes você pode traçar um comportamento semelhante à mesma biblioteca usada para análise de argumentos, mas provavelmente não quer ler as fontes para descobrir isso.

Você realmente não pode inferir a sintaxe de argumento de um programa de outro.

Se você também considera o Windows, fica ainda pior: enquanto as chamadas da linha de comando do Windows usam tradicionalmente /f (pelo menos na maioria das vezes, caracteres únicos) para opções, com : como separador entre opções e suas valor (consulte, por exemplo, aqui ) ; Os utilitários multi-plataforma são difundidos (como aqueles que você mencionou) e trazem a sintaxe de hífen mais comum para argumentos, com todas as inconsistências mencionadas acima.

    
por 28.12.2011 / 12:30
7

Esta é uma convenção vinda de * nix. O hífen duplo precede as opções quando elas são escritas no total , enquanto o hífen único precede as opções quando elas são gravadas em formato curto . Por exemplo, ls --all --l , pode ser reduzido para ls -al . Como se vê, nem todas as opções têm seus equivalentes de uma única letra, embora as mais usadas usualmente ocorram.

Se a opção aceita um argumento, não faz diferença - ela pode ser usada ou não, independentemente da maneira como você digita a opção.

Ao escrevê-los para uso único, isso realmente não importa, mas ao escrever comandos, por exemplo, em arquivos .alias, é costume usar o formulário completo. Puramente pela facilidade de leitura para a próxima pessoa.

    
por 28.12.2011 / 12:19
3

estas são sintaxes convencionais do UNIX,

um argumento de programa recebe um hífen ("-") seguido por uma única letra quando é uma opção simples (por exemplo: -v ) e dois hífen ("-") quando a opção é tomada argumentos (por exemplo: - arquivo toc.xml ou - file = toc.xml )

sem impacto na funcionalidade do programa.

    
por 28.12.2011 / 10:12
3

O traço único é implementado pelo getopt e é a função padrão posix, o traço duplo em getopt_long e é um padrão do gnu.

Tradicionalmente, um único traço fornece uma única opção de caractere como esta:

-A ou -V etc, mas não precisa se limitar a isso. por exemplo. -Wall para gcc ativa todos os avisos do compilador para o comando do compilador gcc.

Argumentos de duplo traço tendem a ser mais detalhados e geralmente usam um parâmetro fornecido como --max-count = NUM No entanto, --version não leva igual.

De modo geral, não há regras ou padrões definidos sobre como os argumentos do programa devem ser especificados, apenas um monte de tradições. No entanto, se as funções de análise da linha de comando getopt e getopt_long forem usadas, os parâmetros geralmente deverão seguir o padrão, já que as funções da biblioteca impõem uma determinada maneira de fazê-lo.

    
por 28.12.2011 / 23:41