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:
- 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, ...
- 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.