Respostas:
Resposta curta :
Porque está programado para ignorar vários usos de um sinalizador.
Resposta longa:
Como você pode ver no código fonte de ls, há uma parte com a função getopt_long()e um enorme gabinete de chave:
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 dados ao programa. Caso -la variável formatesteja definida. Portanto, quando você digita múltiplo, -lllllllllessa variável é definida várias vezes, mas isso não muda nada.
Bem, isso muda uma coisa. Essa declaração enorme de caso de switch deve ser executada várias vezes, devido a vários -lsinalizadores. lsprecisa de mais tempo para concluir com vários -lsinalizadores. Mas desta vez não vale a pena mencionar. =)
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_OPTIONSjá contenha -l. Seria contra-intuitivo e irritante para esse comando produzir um erro e exigiria lógica extra no script para evitá-lo.
-lpode não ser o melhor exemplo disso, mas espero que você possa ver como o conceito se aplica em geral. Um exemplo muito melhor são as opções do compilador $CFLAGSque podem duplicar opções explícitas em uma chamada específica do compilador.
lscom algum conjunto de opções.
-lseu lsalias pareça uma má ideia, é provável que o mesmo problema ocorra com as opções que são boas em um lsalias interativo como -pou --color=auto.
ls. llpode ser um alias para ls -l, e em um sistema com esse alias, eu poderia digitar ll -lart.
lsnão é um bashcomando, mas um executável separado do qual você inicia bash. Dito isto, -lé apenas um tipo de sinalizador booleano que, se presente, faz lscom que use um formato de estilo longo para a saída. A maioria dos programas simplesmente ignora vários usos ( ls -llé o mesmo que ls -l -l) desses sinalizadores, embora existam algumas exceções (por exemplo, se -vsignifica 'detalhado', um programa pode interpretar vários usos para significar "ser ainda mais detalhado").
-vvvé ssh.
aptitude moo
Os aliases do shell seriam muito irritantes se comandos como lsnão permitissem opções repetidas.
Suponha que você tivesse
alias ls='ls --color=auto'
alias rm='rm -i'
Se não fossem permitidos sinalizadores conflitantes, seria um erro emitir comandos como ls --color=neverou ls --color=autoou rm -i.
Portanto, esses comandos foram projetados para permitir que sinalizadores posteriores substituam os sinalizadores anteriores.
--inplacee --delay-updates, por exemplo.) Algumas ferramentas apenas aceitam o que vier por último; rm -ifprovavelmente é um bom exemplo lá. Mas não há conflito na opção -l das ls, portanto, ls -le ls -llnão é um problema, e não afeta a execução de qualquer maneira significativa. Os computadores são bons em repetições entorpecentes.