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

65

Fiquei 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?

Por exemplo, a maioria dos programas se parece com isso: relaxer -dtd toc.xml toc_gr.xml toc_jp.xml

Enquanto alguns programas são assim: xmllint --valid toc.xml --noout

Por que alguns exigem dois hífens em vez de um? Não faz sentido que todos sigam um padrão (ou seja, um único traço serve ).

Pacerier
fonte
10
> Não faz sentido que todos sigam um padrão - sim. Todos os programadores seguem os padrões e mantêm a consistência? Não. Muitos programadores nem conseguem manter a consistência em seus programas :) Dito isso, o consenso seria usar apenas um traço para opções de uma letra e dois traços para tudo o que são realmente palavras, por exemplo, -ivs. --inputou -n --dry-run.
slhck
11
@slhck Heys obrigado pela ajuda =) Por essa convenção, então, isso significa que -dtdrealmente deveria ter sido --dtd? Efetivamente, o que eu queria saber é o que o traço (e o traço duplo) está tentando significar?
Pacerier
6
Para pontos de bônus: os programas em conformidade com os padrões Gnu --long-optionstambém aceitarão qualquer abreviação única. Portanto, para um programa com opções --file-ine --file-out, você pode usar --file-o=fooou --file-i=foo, o que pode economizar digitação --very-long-optional-parameters.
BRPocock
GNU veio junto com suas convenção de usar dois traços para as opções de "longas", que acontece que eu prefiro, mas muitos utilitários mais antigos, como aqueles que junto com o X Window System, bem como ImageMagick ( por exemplo , convert, mogrify) têm "longo" opções usando apenas um único traço. Por exemplo: xterm -fn 6x10 -geometry 80x24+30+200. Abreviações são suportadas, desde que sejam distintas ( por exemplo , -gou -geompara -geometry). Veja X (7) para outros exemplos.
TheDudeAbides 23/01

Respostas:

18

Basta fazer ls --help e olhar para as opções; deve 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, no que diz respeito aos parâmetros, é simplesmente que, na forma longa, quando eles tomam um parâmetro, parece que sempre está igual. Mas, obviamente, os curtos podem aceitar parâmetros da mesma forma; apenas eles não usam iguais.

Aqui está um extrato de ls --help( man lsfornece informações equivalentes). Observe como alguns têm uma forma muito tempo sem um formulário curto ( --author, --block-size), alguns têm um pequeno formulário sem uma forma longa ( -c, -f, -g), e alguns têm ambos uma forma de comprimento e uma forma curta ( -A/ --almost-all, -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'
barlop
fonte
4
Como fazemos um ls --helpno windows?
Pacerier
11
@Pacerier Não existe lsno Windows. O comando equivalente seria dir /?. Você está usando um software de plataforma cruzada que viola as convenções usuais do Windows, veja minha resposta.
Daniel Beck
@Pacerier Não está embutido, mas faça o download de terceiros. Gnuwin32 você faz o download (google gnuwin32). existem vários pacotes no gnuwin32, cada um com comandos, faça o download do pacote coreutils, que possui muitos comandos comuns.
barlop
Existem opções longas sem opções curtas no seu ls --helptrecho. Veja --authore --block-size.
Dan
Para responder à pergunta no comentário original do @ Pacerier: A maneira mais comum de os sistemas Windows modernos obterem o lscomando é via GIT . O shell bash do GIT ou a janela CMD com compartimento GIT no PATH terá ls.
yzorg 17/02
34

Não existe um padrão generalizado. Há alguma consistência, por exemplo, nos programas GNU, mas você precisa verificar a documentação de cada programa.

Citando a Wikipedia , ênfase minha:

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.

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


Você encontrará frequentemente o mesmo argumento disponível tanto na opção curta quanto na 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 de vários caracteres, mas não todos (GNU findvem à mente). Alguns programas têm hífens opcionais ou os ignoram completamente ( tarou BSD psvem à mente).

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

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

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 você pode escolher.

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

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

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


Se você também considera o Windows, fica ainda pior: enquanto a linha de comando do Windows chama tradicionalmente /f(pelo menos na maioria das vezes, caracteres únicos) para opções, com :o separador entre as opções e seu valor (veja, por exemplo, aqui ); os utilitários de plataforma cruzada são generalizados (como os mencionados) e trazem a sintaxe de hífen mais comum para argumentos, com todas as inconsistências mencionadas acima.

Daniel Beck
fonte
2
Deve-se notar que as bibliotecas padrão GNU fornecem a funcionalidade de mapear as opções de uma menos uma letra e duas menos várias letras; portanto, todos os novos programas GNU e a maioria dos novos softwares livres em geral usam essa notação (por exemplo: f, -f foo, --file, --file foo, --file = foo, --fil = foo, --fi = foo); throwbacks, tais como tar, ps, finde tal teve a sua sintaxe de linha de comando definido pela POSIX antes de este padrão tinham completamente gelificado. Em um sistema Gnu / Linux, é uma aposta razoavelmente segura de que pelo menos --help(quase) sempre será suportado, assim como man <command>ouinfo <command>
BRPocock
o padrão GNU diz que você não deve ter um formato curto sem um formato longo e não deve ter um formato longo sem um formato curto?
barlop
+1 por ser a resposta mais completa, incluindo menção ao GNU findque não segue a "convenção GNU" para opções longas (provavelmente por motivos de conformidade com o POSIX, como o @BRPocock apontou). Eu faria +1 novamente se pudesse, por mencionar a linha de comando do DOS / Windows "switches", já que a pergunta do OP de alguma forma foi marcada como "windows" e essa convenção deve ser mencionada por completo.
TheDudeAbides 23/01
7

Esta é uma convenção vinda do * nix. O hífen duplo precede as opções quando elas são escritas na íntegra , enquanto o hífen único precede as opções quando elas são escritas em formato abreviado . 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 tenham.

Se a opção aceita um argumento realmente não faz diferença - pode aceitá-los ou não, independentemente da maneira como você insere a opção.

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

Torre
fonte
Ei, obrigado pela ajuda. Btw, existe uma razão para você digitar unix como * nix?
Pacerier
2
@Pacerier - Unix é um nome comercial. Ao digitar * nix, na verdade me refiro a todos os sistemas unix e similares, que para todos os propósitos práticos, são os mesmos. Mas, principalmente, é uma força do hábito ...
Rook
2
@Pacerier * nix pode se referir ao Linux ou Unix. Não tenho muita certeza disso, porque há algum tempo atrás eu olhei para ele, mas tecnicamente, se bem me lembro, o BSD é da família Unix. Tecnicamente, o Linux não é .. e o FreeBSD também não. Mas dizer * nix incluiria unix / bsd e qualquer coisa assim, por exemplo, linux e freebsd.
barlop
2
+1 por mencionar a combinação do comando taquigráfico. essa é a verdadeira razão pela qual existem dois estilos.
Ryan_S
3

estas são sintaxes convencionais do UNIX,

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

sem impacto na funcionalidade do programa.


fonte
3
Além disso, em muitos casos, com opções de letra única após um único traço, você pode agrupar as letras. Por exemplo, "ls -al" é igual a "ls -a -l". As opções de traço duplo não podem ser combinadas dessa maneira. As opções de letra única são um padrão mais antigo, mas atualmente muitos comandos assumem os dois tipos. Por exemplo, "ls --all" é o mesmo que "ls -a".
Randy Orrison
3
Na verdade, outra correção. As opções de letra única de traço único podem assumir um parâmetro, mas geralmente não estão vinculadas a um sinal de igual. Por exemplo, "tail -n 50" mostra as últimas 50 linhas de um arquivo, equivalente a "tail --lines = 50".
Randy Orrison
Por esta convenção, significa que --noout(na pergunta acima) deveria realmente ter sido escrito, -nooutpois não possui argumentos ?
Pacerier
11
o que é dito nesta resposta sobre parâmetros está totalmente errado. A primeira frase é óbvia. A última frase é óbvia. E o parágrafo no meio que deve responder à pergunta está totalmente errado.
barlop
@ RandyOrrison quando uma única letra que eu nunca vi um sinal de igual ... e para elaborar o seu argumento, elas geralmente usam parâmetros .. wget -w 10 head -n 3 cut -b 2 E olha Ping -? !! Cargas recebem parâmetros. Esta resposta é terrível
barlop
3

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

Tradicionalmente, um único traço fornece uma opção de caractere assim:

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

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

De um 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 de linha de comando getopt e getopt_long forem usadas, os parâmetros geralmente deverão seguir o padrão, pois as funções da biblioteca impõem uma certa maneira de fazê-lo.

Matt H
fonte