variações do argumento da linha de comando do Linux

2

Novo no Linux e tenha algumas dúvidas sobre os argumentos da linha de comando:

Digamos que existe uma ferramenta de linha de comando chamada widget que recebe um argumento chamado fizz . Eu vi todos os diferentes tipos de argumentos:

widget -fizz
widget --fizz
widget \fizz
widget -f

Qual é a diferença em como eles são usados? A ferramenta de linha de comando decide como determiná-los de maneira diferente, ou o Linux sabe que todos eles significam a mesma coisa, mas os alimenta para o aplicativo de maneira diferente?

Poderia personalizar minha própria maneira de passar a ferramenta (% existente)widget its fizz argument:

widget #f#

Obrigado antecipadamente!

    
por pnongrata 04.02.2012 / 23:13

3 respostas

2

Whats the difference in how these are used?

Isso depende inteiramente do programa, porque ...

Does the command-line tool decide how to determine them differently, or does Linux know they all mean the same thing, but feeds them to the application differently?

... os argumentos para o processo entram como uma matriz de strings individuais.

Há duas coisas envolvidas aqui: uma é o shell, que analisa a entrada que você digita e executa o processo. Isso, por exemplo, divide a string no espaço em branco e passa para widget . Veja, por exemplo, man sh e man bash para detalhes sobre como eles lidam com essas coisas.

Por fim, no entanto, widget obtém o argumento -fizz ou --fizz exatamente como está escrito, como uma string. Decide o que fazer com isso.

Existem alguns padrões - muitas variantes de getopts e popt que processam esses argumentos para widget e têm algum grau de comportamento "padrão".

Nada impede o autor de widget de inventar seu próprio padrão.

Então, finalmente, se você for o autor de widget ou modificar o código-fonte, você pode absolutamente fazer com que ele trate #f# como o argumento fizz . Você não pode fazer isso sem mudar o programa.

    
por 04.02.2012 / 23:21
2

Does the command-line tool decide how to determine them differently, or does Linux know they all mean the same thing, but feeds them to the application differently?

É o trabalho do executável, ou função, avaliar seus argumentos. O shell (não Linux, mas bash , csh , etc.) não irá interferir com esses argumentos.

Isso significa que cada argumento é tratado de maneira diferente no seu caso. No entanto, observe que o shell executa expansões ou substituições antes que o comando receba seus argumentos. Quando você, por exemplo, tem uma pasta com duas imagens JPG e escreve:

ls *.jpg

Em seguida, o shell expandirá *.jpg para image1.jpg image2.jpg , portanto, resultando em ls sendo passado nos seguintes argumentos:

ls image1.jpg image2.jpg

Além disso, você não pode realmente modificar um script para ter outro argumento além do que já está compilado ou gravado no executável, além de reescrever o código-fonte.

Verifique também a seguinte pergunta:

What's the difference between one-dash and two-dashes for command prompt parameters?

    
por 04.02.2012 / 23:21
0

Primeiro, é improvável que você veja qualquer argumento começando com \ no Linux, porque na maioria dos shells isso é um caractere de escape, usado para escapar de espaços e outros caracteres que são significativos para o shell ( $ , "" , () , etc.).

O shell do Linux (Bash na maioria das distros) apenas passa cada argumento separado por espaço como strings para o processo. O que o processo decide fazer com eles é a escolha do programador.

Normalmente, o prefixo - indica uma opção curta (como -h ) e o -- indica uma versão mais longa (como --help ). Isso faz parte do padrão POSIX que a maioria dos programas Linux usa, que foi herdada das primeiras ferramentas do Unix. Veja o artigo getopt na Wikipedia para mais informações.

Para sua última pergunta, não, você não pode modificar a maneira como a ferramenta widget interpreta esses argumentos, a menos que você modifique seu código-fonte.

Em alguns sistemas Unix, existe um utilitário bacana chamado pargs que permite que você Veja todos os argumentos que foram passados para o processo. No Linux, você pode replicar isso usando

ps eww -p 12345

Onde 12345 é o identificador do processo (PID). Consulte esta resposta para obter uma alternativa.

    
por 04.02.2012 / 23:42