Por que alguns utilitários analisam operandos antes das opções?

5

De acordo com vários sources , as diretrizes do utilitário UNIX especificam que os operandos sempre devem ser processados após as opções:

utility_name[OPTIONS][operands...]

Alguns utilitários UNIX mais antigos não seguem essas convenções, por exemplo, find , mas os utilitários mais recentes e bem estabelecidos também violam as regras sem uma explicação aparente, por exemplo, curl <url> .

Eu gostaria de saber se há uma boa razão para isso e qual é o consenso geral da comunidade sobre isso.

    
por Jorge Bucaran 08.02.2015 / 16:25

1 resposta

3

A convenção normal é que os argumentos sempre seguem as opções. A primeira não opção (a primeira cadeia na linha de comando que não inicia com - ) termina as opções e inicia os argumentos.

Algumas ferramentas, principalmente as ferramentas de compilação (compiladores, linkers), sempre foram contra essa convenção. Outro exemplo que você nota é find . Às vezes isso é feito porque as opções entram em vigor no ponto da linha de comando em que aparecem, portanto, é necessário especificar os argumentos antes e depois da opção, onde a opção se aplica a esse argumento apenas se o argumento aparecer após a opção .

Esta convenção permite que você escreva um script de shell que contenha uma linha como esta:

rm foobar ${more_things_to_remove}

... e garanta que você não pode adicionar opções ao comando rm acidentalmente, mesmo que a variável more_things_to_remove da shell tenha um valor desagradável como " -rf ".

Essa convenção é anterior à convenção mais recente de usar a opção especial -- para finalizar o processamento da opção. -- é uma maneira muito melhor de marcar o fim das opções explicitamente:

rm -- foobar ${more_things_to_remove}

# and it works even if you don't need to delete something called "foobar":
rm -- ${more_things_to_remove}
Então, ultimamente (e ultimamente, quero dizer, isso já vem acontecendo há muitos anos), muitos parsers de linha de comando parecem estar se movendo em direção a quebrar a convenção anterior e permitir que opções e argumentos sejam misturados aparentemente em todos os lugares ( sujeita sempre a -- forçando o fim das opções) mesmo que eles não tenham nenhuma razão especial para quebrar a convenção como compiladores e algumas outras ferramentas fizeram.

Pessoalmente eu nunca sei quais utilitários ainda aderem à convenção e quais não, então eu sempre coloco as opções antes dos argumentos como antes, e fico levemente surpreso quando vejo o código de trabalho de outra pessoa que faz isso na ordem oposta!

    
por 09.02.2015 / 04:39