É novo no Linux e tem algumas dúvidas sobre argumentos de linha de comando:
Digamos que exista uma ferramenta de linha de comando chamada widget
que 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 widget
da 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 sh
e man bash
para obter detalhes sobre como eles lidam com essas coisas.
Em última análise, porém, widget
obtém o argumento -fizz
ou --fizz
exatamente como está escrito, como uma string. Ele decide o que fazer com isso.
Existem alguns padrões - muitas variantes de getopts
and popt
que processam esses argumentos widget
e têm algum grau de comportamento "padrão".
Porém , nada impede o autor de widget
inventar seu próprio padrão.
Então, finalmente, se você é o autor widget
ou modifica o código-fonte, você pode absolutamente fazer com que ele seja tratado #f#
como fizz
argumento. 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
, csh
etc.) 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 *.jpg
para image1.jpg image2.jpg
, resultando na ls
transmissã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 widget
ferramenta 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.