Muitas vezes me pego escrevendo funções de shell ou scripts de shell que devem ser wrappers em torno de outros comandos.
Também é frequente que eu queira que tal wrapper suporte alguns sinalizadores/opções. A ideia é que o wrapper deve selecionar dos argumentos da linha de comando todos os sinalizadores/opções que ele suporta (junto com seus argumentos, quando aplicável) e passar os argumentos restantes como argumentos para o comando agrupado.
Agora, na maioria das vezes, o comando wrap também oferece suporte a sinalizadores e opções próprias. Isso significa que, de acordo com o esquema descrito acima, o wrapper deve ser capaz de lidar com argumentos de linha de comando que incluam seus próprios sinalizadores/opções, bem como aqueles suportados pelo comando wrapper.
Uma maneira de implementar tal wrapper seria especificar as opções do wrapper e do comando wrapper em uma chamada para GNU getopt
, então coletar todas as últimas, juntamente com quaisquer argumentos sem opção, em algum array WRAPPED_COMMAND_ARGUMENTS
. Então, em algum momento posterior, o comando agrupado é invocado com "${WRAPPED_COMMAND_ARGUMENTS[@]}"
seus argumentos de linha de comando.
Essa abordagem funcionou razoavelmente bem para mim, mas torna-se proibitivamente trabalhosa quando o comando wrap tem muitas opções.
Em vez disso, gostaria de descobrir o que no título deste post me refiro como uma "alternativa permissiva ao GNU getopt
". Com isso, quero dizer uma ferramenta que, como getopt
, me ajuda a analisar as opções sobre as quais falo explicitamente e trata todos os outros argumentos restantes igualmente, ou seja, não faz distinção com base na presença ou não de hífens à esquerda.
Existe uma coisa dessas?
Um método comum para tarefas como esta é usar
--
como um separador entre as opções a serem tratadas pelo script wrapper e as opções a serem passadas textualmente para o programa que está sendo executado pelo wrapper, por exemplo--
marca o fim das opções paramy-wrapper
. Todos os outros argumentos e todas as opções após o--
podem ser passados para o programa que ele envolve, seu script wrapper não precisa lidar com eles.Ele também permite usos conflitantes de opções - por exemplo,
grep
e muitos outros programas usam-i
para significar que as pesquisas não devem diferenciar maiúsculas de minúsculas, enquanto você pode querer usar-i
em seu script wrapper para especificar um arquivo de entrada. Ao usar--
, não há conflito --i
antes do--
meio "arquivo de entrada",-i
depois do--
meio "sem distinção entre maiúsculas e minúsculas".Também vale a pena notar: o programa que você agrupa também pode interpretar
--
como o fim de suas opções, com tudo depois de--
ser tratado como nomes de arquivo ou strings ou outros argumentos não opcionais (por exemplo, para evitar que nomes de arquivos começando com-
sejam tratados como opções).BTW,
--
tem sido usado para marcar o fim das opções desde pelo menos o final dos anos 1970 ou início dos anos 1980.