Separando argumentos de comando de sinalizadores

0

Digamos que eu tenha um comando que receba sinalizadores e argumentos, assim:

mycommand --foo bar arg1 arg2

(O foo sinalizador tem um valor "bar" .)

Mas e se o sinalizador foo puder ser fornecido opcionalmente sem argumento?

mycommand --foo arg1 arg2

Como evito que arg1 seja considerado o valor da foo flag?

    
por callum 29.06.2016 / 16:05

3 respostas

2

O idioma mais comumente usado no Unix para separar os sinalizadores de linha de comando do restante dos argumentos é usar um traço duplo ( -- ).

Se o utilitário usar a função da biblioteca C getopt() (direta ou indiretamente), o traço duplo sinalizará o final das opções da linha de comando e getopt() encerrará a análise da linha de comando.

Isso é do getopt(3) manual no OpenBSD:

The interpretation of options in the argument list may be cancelled by the option ‘--’ (double dash) which causes getopt() to signal the end of argument processing and return -1.

É por isso que a maneira correta de excluir um arquivo chamado -f é

$ rm -- -f

por exemplo.

É provável que seu shell implemente o comando getopts (que geralmente é, mas nem sempre, um comando interno) com uma chamada para essa função de biblioteca.

IMHO, é bom saber como usar getopts em scripts de shell e getopt() em programas em C. Não é muito difícil e torna a vida muito mais fácil quando você escreve o código de análise da linha de comando do seu projeto.

Há também um getopt_long() disponível em algumas bibliotecas C, para analisar "opções longas" ( --option=value ). Isso, no entanto, é uma extensão (sem trocadilhos).

    
por 12.07.2016 / 23:10
1

Considere algo como:

mycommand --foo=bar arg1 arg2

A exigência de =<someval> ao atribuir um valor ao sinalizador removeria ambiguidades.

Está claro que este é um caso diferente em que o valor não é especificado:

mycommand --foo arg1 arg2
    
por 12.07.2016 / 23:05
0

Não há uma resposta geral para isso. Depende inteiramente de como mycommand interpreta seus argumentos.

    
por 12.07.2016 / 22:43