Por que ls aceita comutadores duplicados?

16

Estou curioso - existe uma diferença entre ls -l e ls -lllllllllllllllllllllllllllll ?

A saída parece ser a mesma e estou confuso sobre por que ls permite switches duplicados. Esta é uma prática padrão entre a maioria dos comandos?

    
por Mike B 08.08.2014 / 20:33

4 respostas

17

Resposta curta :

Porque está programado para ignorar múltiplos usos de um sinalizador.

Resposta longa:

Como você pode ver no código-fonte de ls , existe uma parte com a função getopt_long() e um grande switch case:

1648       int c = getopt_long (argc, argv,
1649                            "abcdfghiklmnopqrstuvw:xABCDFGHI:LNQRST:UXZ1",
1650                            long_options, &oi);
      ....
1654       switch (c)
1655         {
      ....
1707         case 'l':
1708           format = long_format;
1709           break;
      ....
1964     }

A função getopt_long() lê todos os parâmetros fornecidos ao programa. No caso, se -l a variável format estiver definida. Portanto, quando você digitar vários -lllllllll , essa variável será definida várias vezes, mas isso não alterará nada.

Bem, isso muda uma coisa. Essa declaração de maiúsculas e minúsculas deve executar várias vezes, devido a vários -l sinalizadores. ls precisa de mais tempo para ser concluído com vários -l flags. Mas desta vez não vale a pena mencionar. =)

    
por 08.08.2014 / 21:22
20

Porque é a coisa certa a fazer. Suponha que você tenha um script fazendo algo como:

ls $LS_OPTIONS -l "$dir"

onde é possível que $LS_OPTIONS já contenha -l . Seria contra-intuitivo e irritante para este comando produzir um erro e exigiria uma lógica extra no script para evitá-lo.

-l pode não ser o melhor exemplo para isso, mas esperamos que você possa ver como o conceito se aplica em geral. Um exemplo muito melhor é as opções do compilador em $CFLAGS que podem duplicar opções explícitas em uma invocação específica do compilador.

    
por 08.08.2014 / 23:10
11

ls não é um comando bash , mas um executável separado que você inicia em bash . Dito isso, -l é apenas um tipo de sinalizador booleano, que, se presente, faz com que ls use um formato de estilo longo para a saída. A maioria dos programas simplesmente ignora múltiplos usos ( ls -ll é o mesmo que ls -l -l ) de tais flags, embora haja algumas exceções (como exemplo, se -v significa 'verbose', então um programa pode interpretar múltiplos usos para significa "ser ainda mais detalhado").

    
por 08.08.2014 / 20:36
8

Aliases de shell seriam muito irritantes se comandos como ls não permitissem opções repetidas.

Suponha que você tenha

alias ls='ls --color=auto'
alias rm='rm -i'

Em seguida, se os sinalizadores conflitantes não forem permitidos, seria um erro emitir comandos como ls --color=never ou ls --color=auto ou rm -i .

Portanto, esses comandos são projetados para permitir que os sinalizadores posteriores substituam os anteriores.

    
por 09.08.2014 / 12:27

Tags