Comutadores de um único caractere no bloco [-abc] com parâmetros

2

Imagine que você tenha um comando foo que usa três opções de caractere único a , b e c . Todos esses switches usam várias opções.

i.e. foo -a opt1 -b opt2 -c opt3

O que acontece (ou o que deve acontecer) quando os switches estão em um único bloco?

i.e. foo -abc opt1 opt2 opt3

Existe uma prática padrão para o que acontece (ou seja, c obtém opt1 opt2 opt3 , ou a obtém bc opt1 opt2 opt3 , ou um erro é lançado, etc.) ou depende do programa interpretá-lo?

    
por MynockSpit 28.12.2017 / 19:55

3 respostas

2

O padrão POSIX diz :

Guideline 5: One or more options without option-arguments, followed by at most one option that takes an option-argument, should be accepted when grouped behind one '-' delimiter.

Portanto, em um utilitário compatível com POSIX, foo -abc opt1 opt2 opt3 significa:

  • -a opção com bc como opção-argumento.
  • opt1 , opt2 e opt3 como argumentos padrão.

Se foo não for um utilitário compatível com POSIX, seu manual deverá esclarecer essas situações.

    
por 28.12.2017 / 20:15
2

Nos programas que usam getopt() , se -a aceitar um argumento, então foo -abc opt1 opt2 opt3 é -a com o argumento bc , então as não opções opt1 , opt2 , opt3 . Se -a não aceitar um argumento, o comportamento dependerá se -b e -c receberem argumentos.

A descrição POSIX de getopt() é bastante clara sobre isso:

If the option takes an argument, getopt() shall set the variable optarg to point to the option-argument as follows:

  1. If the option was the last character in the string pointed to by an element of argv, then optarg shall contain the next element of argv, ...
  2. Otherwise, optarg shall point to the string following the option character in that element of argv ...

Mas isso não quer dizer que pode não haver programas que façam as coisas de maneira diferente. A maneira tradicional de passar argumentos para tar coloca todos os sinalizadores em um pacote no primeiro argumento de linha de comando, com todos os argumentos necessários para as opções nos seguintes argumentos de linha de comando, em ordem.

Neste exemplo do manual do FreeBSD alcatrão :

tar tbf 32 file.tar

os sinalizadores b e f recebem argumentos, que são 32 e file.tar aqui. É claro que esse modo é bastante distinto, pois os argumentos não são precedidos por um traço. Usando um traço leva a mais getopt , como a análise, o que significa que tar xfv e tar -xfv são diferentes (já que -f leva um argumento).

Então, é claro, alguns programas aceitam opções que são palavras completas, mas ainda começam com um único traço, então sem conhecer o programa em questão, não há como saber se -abc é uma opção, três opções ou uma opção com um argumento. O estilo GNU de prefixar opções longas com um traço duplo, pelo menos, torna a distinção clara.

    
por 28.12.2017 / 20:32
0

Depende totalmente do programa que interpreta sua entrada.

Normalmente, você pode encadear opções curtas (por exemplo, foo -abc ), desde que essas opções não recebam argumentos. Isso é feito por convenção e porque as bibliotecas de análise de argumentos padrão (como getopts) suportam isso.

No entanto, não tenho conhecimento de nenhum programa comumente usado que não ofereça suporte a opções curtas de encadeamento.

    
por 28.12.2017 / 20:07