Por exemplo:
xargs -n 1
é o mesmo que
xargs -n1
Mas se você olhar para a página do manual , a opção será listada como -n max-args
, o que significa que o espaço deve ser preservado. Não há nada sobre a forma abreviada -n max-args .
Isso também acontece com muitos outros utilitários Linux.
Como isso é chamado no Linux? Todos os utilitários suportam o formulário abreviado (mas nunca o documentam na página de manual)?
Respostas:
Ao escrever a linha de comando que analisa parte do seu código, você especifica quais opções recebem argumentos e quais não. Por exemplo, em um script de shell que aceita uma
-h
opção (para obter ajuda, por exemplo) e uma-a
opção que deve receber um argumento, você deveO
a:h
trecho diz "Estou esperando analisar duas opções-a
e-h
, e-a
deve aceitar um argumento" (é o:
seguintea
que diz ao analisador que-a
aceita um argumento).Portanto, nunca há ambiguidade em onde uma opção termina, onde seu valor começa e onde outra começa depois disso.
Executando:
É por isso que na maioria das vezes você não deve escrever seu próprio analisador de linha de comando para analisar as opções.
Há apenas um caso neste exemplo que é complicado. A análise geralmente para na primeira não opção, portanto, quando você tem coisas na linha de comando que se parecem com opções:
O seguinte resolve que:
Ele
--
sinaliza as opções de final de linha de comando e o-world
bit é deixado para o programa fazer o que quiser (está em uma das variáveis posicionais).A propósito, é assim que você remove um arquivo com um traço no início de seu nome de arquivo
rm
.EDIT :
Os utilitários escritos em C chamam
getopt()
(declarados emunistd.h
) que funcionam praticamente da mesma maneira. Na verdade, por tudo que sabemos, abash
funçãogetopts
pode ser implementado usando uma chamada para a função de biblioteca Cgetopt()
. Perl, Python e outras linguagens têm bibliotecas de análise de linha de comando semelhantes e é mais provável que elas realizem sua análise de maneiras semelhantes.Algumas dessas rotinas de biblioteca
getopt
egetopt
similares também lidam com opções "longas". Geralmente, são precedidos por double-dash (--
), e as opções longas que recebem argumentos geralmente o fazem após um sinal de igual, por exemplo, a--block-size=SIZE
opção de [algumas implementações do]du
utilitário (que também permite-B SIZE
especificar a mesma coisa).Os manuais de razão são muitas vezes escritos para mostrar um espaço entre as opções curtas e seus argumentos provavelmente para facilitar a leitura.
EDIT : Ferramentas realmente antigas, como os utilitários
dd
etar
, têm opções sem traços na frente deles. Isso é puramente por razões históricas e para manter a compatibilidade com o software que depende deles para funcionar exatamente dessa maneira. Otar
utilitário ganhou a capacidade de escolher opções com traços nos últimos tempos. O manual do BSDtar
chama as opções de estilo antigo para "sinalizadores agrupados".fonte
getopt()
(declarado emunistd.h
), o que faz a mesma coisa.-a -b
===-ab
-a
tiver argumento opcional,-ab
não será o mesmo-a -b
). O GNU getopt não interrompe o processamento de sinalizadores ao encontrar um não sinalizador: em vez disso (por padrão), em vez disso, reorganiza os sinalizadores na frente do argv.xargs
é um dos utilitários POSIX. Conforme comentado por @drewbenn, o POSIX documenta o comportamento de análise de opções para a maioria de seus utilitáriosgetopt
, com algumas permissões para outras implementações, dizendo na 12.1 Sintaxe de argumentos do utilitário :e concluindo com
No POSIX (lembre-se de que ele cobre apenas os utilitários mais usados), há exceções que passam operandos que seriam opções em outros utilitários como parâmetros posicionais ou parâmetros com sintaxe especial :
O POSIX permite valores opcionais de opção:
Imediatamente, não me lembro quais utilitários POSIX usam o recurso. As ncurses
tic
einfocmp
utilitários usam o recurso para níveis da opção-v
(detalhado / depurar).O ponto específico sobre o qual você perguntou está detalhado no restante desse parágrafo, em várias linhas.
Antes do POSIX, algumas implementações de
ps
opções aceitas sem um hífen à esquerda. A descrição do POSIX não menciona isso na descrição do utilitário ou na lógica da sintaxe:Além do POSIX, existem implementações de opções longas (como GNU getopt_long ou X Toolkit ), usando várias maneiras de separar ou associar o valor de uma opção à opção. Por exemplo, a pontuação pode ser usada:
Dependendo da implementação, um traço duplo pode / não pode ser usado para distinguir opções longas de curta (getopt): lynx e X Toolkit usam um único traço; O GNU
getopt_long
usa um traço duplo, por exemplo. Além disso, a+
pode ser usado para indicar que uma opção é negada.A descrição do POSIX não parece mencionar nada disso, mas é provável que você os encontre.
fonte
-option=value
suposto ser--option=value
(o formato de longa opção, dois traços no início, em vez de um)?