Por que os POSIX encontram parâmetros diferentes de outros estilos de programa?

4

Por que um parâmetro no comando POSIX find é adicionado com um único hífen para nomes de parâmetro de vários caracteres, enquanto a maioria dos outros programas usa um hífen para indicar vários sinalizadores de caractere único e hifens duplos para indicar nomes de parâmetro único com vários caracteres?

Isso parece inconsistente e estou curioso para

por que não é realmente inconsistente ou  B. a história dessa decisão.

    
por Jonah 08.06.2013 / 06:48

3 respostas

6

Note que o POSIX find suporta opções como outros comandos e -- para marcar o final deles como outros comandos. Esses são -H e -L .

As -print , -type ... não são opções, às vezes são chamadas de predicados . Eles são argumentos cuja ordem é importante que apareçam depois dos caminhos de arquivos que aparecem após as opções. Você também tem ( e ! . Juntos, eles criam uma expressão que é usada para determinar quais arquivos encontrar.

find não é o único. [ (também conhecido como test ) e expr são outros comandos cujos argumentos são usados para criar uma expressão .

Como find , [ tem operadores que começam com - e são mais de uma letra ( -gt , -eq ...).

Como find , test tem problemas onde os operadores podem ser confundidos com operandos .

find -- "$file1" "$file2" -type f
[ -f "$file1" -a -f "$file2" ]

Se $file2 for ! , é um problema com find . Se for = , é um problema com (alguns) [ .

Para todos os find , test e expr , o uso das opções para criar a expressão não teria funcionado. Outra opção poderia ter sido ter uma string avaliada como a expressão como awk ou sed . como para

find f1 f2 \( -type f -mtime -1 -o ! -type f -newer x \) -exec ls -ld {} +

Faça:

find 'found = 0
      if (typeof($f) == "f") {
        if (age($f) > 1) found=1
      } else if (age($f) < age("x")) found = 1
      if ($found) exec_multi("ls -ld {}")' f1 f2

Mas isso significa implementar um analisador gramatical em find . Isso também significa um pesadelo de cotação em potencial para o "x" e a linha de comando acima.

Na verdade, a AT & T Research criou esse comando: tw (andador de árvores), mas apesar de agora ser de código aberto, não sei se ele é realmente usado fora da AT & T.

    
por 08.06.2013 / 08:39
6

find é mais antigo que a convenção GNU de usar -- para opções de várias letras. O GNU introduziu esta convenção para quebrar a inconsistência existente entre programas com opções de uma única letra, para as quais -bar significava as três opções -b -a -r e programas com opções de múltiplas letras, para as quais -bar significava uma única opção com esse nome . No momento em que o GNU surgiu, ele poderia influenciar programas futuros, mas não alterar programas existentes, como find ou outros, como os utilitários X11.

find usou - como um prefixo para predicados e ações porque eles são como opções: eles são palavras-chave, parte de um conjunto finito que é significativo para um comando específico. Embora não sejam analisadas como opções, elas são lexicograficamente como opções.

    
por 11.06.2013 / 02:36
2

Eu acho que não houve uma decisão consciente para fazer diferente. Eu não tenho referências para além de esta troca de e-mail, mas pelo que me lembro (tendo usado a partir de meados eightees):

O que você tem que perceber é que não havia nenhum padrão para começar a especificar opções e argumentos (como argumentos de linha de comando para programas). Programas diferentes implementaram diferentes maneiras de fazer as coisas. Em algum ponto, o único traço para opções e não traços para argumentos tornou-se reutilizado / copiado de comandos usados com frequência, e a versão de getopt ficou disponível, tanto para shells quanto para versões em C. (Lembro de ter compilado minha própria versão porque o * nix em que trabalhei não tinha em uma biblioteca).

É claro que as opções de traço único e único caracterizaram as restrições tty (o mesmo que leva a comandos abreviados ( cp vs. copy ), mas onde não são auto-explicativas. Os desenvolvedores de encontrar provavelmente escolheram opção único caractere para mais clareza, bem como mais do que as opções de caracteres minúsculos 26. Eles fizeram isso antes do traço duplo -- para opções longas se tornou popular (meados dos anos IIRC).

A página man original tinha o seguinte na parte inferior:

BUGS
     The syntax is painful.
    
por 08.06.2013 / 07:22