Variações de argumentos de linha de comando do Linux

Variações de argumentos de linha de comando do Linux

É novo no Linux e tem algumas dúvidas sobre argumentos de linha de comando:

Digamos que exista uma ferramenta de linha de comando chamada widgetque receba um argumento chamado fizz. Já 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 significam a mesma coisa, mas os alimenta de maneira diferente no aplicativo?

Posso personalizar minha própria maneira de passar o argumento widgetda ferramenta (já existente) fizz:

widget #f#

Desde já, obrigado!

Responder1

Qual é a diferença em como eles são usados?

Isso depende inteiramente do programa, porque...

A ferramenta de linha de comando decide como determiná-los de maneira diferente ou o Linux sabe que todos significam a mesma coisa, mas os alimenta de maneira diferente no aplicativo?

...os argumentos para o processo vêm 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 em espaços em branco e os passa para widget. Veja, por exemplo, man she man bashpara obter detalhes sobre como eles lidam com essas coisas.

Em última análise, porém, widgetobtém o argumento -fizzou --fizzexatamente como está escrito, como uma string. Ele decide o que fazer com isso.

Existem alguns padrões - muitas variantes de getoptsand poptque processam esses argumentos widgete têm algum grau de comportamento "padrão".

Porém , nada impede o autor de widgetinventar seu próprio padrão.

Então, finalmente, se você é o autor widgetou modifica o código-fonte, você pode absolutamente fazer com que ele seja tratado #f#como fizzargumento. Você não pode fazer isso sem alterar o programa.

Responder2

A ferramenta de linha de comando decide como determiná-los de maneira diferente ou o Linux sabe que todos significam a mesma coisa, mas os alimenta de maneira diferente no aplicativo?

É função do executável, ou função, avaliar seus argumentos. O shell (não o Linux, mas o bash, cshetc.) não interferirá de forma alguma nesses argumentos.

Isso significa que cada argumento é tratado de forma diferente no seu caso. Observe, no entanto, que o shell executaexpansõesousubstituiçõesantes 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 será expandido *.jpgpara image1.jpg image2.jpg, resultando na lstransmissão dos seguintes argumentos:

ls image1.jpg image2.jpg

Fora isso, você não pode realmente modificar um script para receber outro argumento além do que já está compilado ou escrito no executável, a não ser reescrever o código-fonte.

Confira também a seguinte pergunta:

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

Responder3

Primeiro de tudo, é improvável que você veja qualquer argumento começando com \no Linux porque na maioria dos shells este é 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 é escolha do programador.

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

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

Em alguns sistemas Unix existe um utilitário bacana chamadopargsque permite ver 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). Veresta respostapara uma alternativa.

informação relacionada